2017-01-05 2 views
0

У меня есть два набора данных, где измерены два значения. Меня интересует разница между значением и стандартным отклонением разницы. Я сделал гистограмму, которую хотел бы поместить в два нормальных распределения. Чтобы вычислить разницу между максимумами. Я также хотел бы оценить эффект, который в наборе данных у меня гораздо меньше данных по одному значению. Я уже посмотрел на эту ссылку, но это не совсем то, что мне нужно: Python: finding the intersection point of two gaussian curvesPython: два нормальных распределения

enter image description here

enter image description here

for ii in range(2,8): 
    # Kanal = ii - 1 
    file = filepath + '\Mappe1.txt' 
    data = np.loadtxt(file, delimiter='\t', skiprows=1) 
    data = data[:,ii] 
    plt.hist(data,bins=100) 
    plt.xlabel("bins") 
    plt.ylabel("Counts") 
    plt.tight_layout() 
    plt.grid() 
    plt.figure() 

plt.show() 
+0

Что такое 'plt'? Такая информация является как актуальной, так и отсутствующей в вашем вопросе. –

+0

Это от 'matplotlib'. –

+0

Это может стать сложным, если вы хотите использовать модели гауссовой смеси. Прочитайте их. – Dschoni

ответ

0

Быстрая и грязная фитинг может быть легко достигнуто с помощью scipy:

from scipy.optimize import curve_fit #non linear curve fitting tool 
from matplotlib import pyplot as plt 

def func2fit(x1,x2,m_1,m_2,std_1,std_2,height1, height2): #define a simple gauss curve 
    return height1*exp(-(x1-m_1)**2/2/std_1**2)+height2*exp(-(x2-m_2)**2/2/std_2**2) 

init_guess=(-.3,.3,.5,.5,3000,3000) 
#contains the initial guesses for the parameters (m_1, m_2, std_1, std_2, height1, height2) using your first figure 

#do the fitting 
fit_pars, pcov =curve_fit(func2fit,xdata,ydata,init_guess) 
#fit_pars contains the mean, the heights and the SD values, pcov contains the estimated covariance of these parameters 

plt.plot(xdata,func2fit(xdata,*fit_pars),label='fit') #plot the fit 

Для дальнейшего r См. справочную страницу scipy: curve_fit

0

Предполагая, что эти два образца независимы, нет необходимости обрабатывать эту проблему с помощью подгонки кривой. Это базовая статистика. Вот некоторый код, который требует выполнения вычислений, причем источник присваивается в комментарии.

## adapted from http://onlinestatbook.com/2/estimation/difference_means.html 

from random import gauss 
from numpy import sqrt 

sample_1 = [ gauss(0,1) for _ in range(10) ] 
sample_2 = [ gauss(1,.5) for _ in range(20) ] 

n_1 = len(sample_1) 
n_2 = len(sample_2) 

mean_1 = sum(sample_1)/n_1 
mean_2 = sum(sample_2)/n_2 

SSE = sum([(_-mean_1)**2 for _ in sample_1]) + sum([(_-mean_2)**2 for _ in sample_2]) 
df = (n_1-1) + (n_2-1) 
MSE = SSE/df 

n_h = 2/(1/n_1 + 1/n_2) 
s_mean_diff = sqrt(2* MSE/n_h) 

print ('difference between means', abs(n_1-n_2)) 
print ('std dev of this difference', s_mean_diff) 
+0

Это выглядит великолепно. и он работает с большинством моих данных. но, кроме вас, проверьте, что два пика возникают из одного файла данных. поэтому у меня есть tgot sample_1 и sample_2. В хороших случаях пики достаточно далеко друг от друга, поэтому я могу легко разделить данные и наш метод. Но что можно сделать в таких случаях, как в сюжете, который я опубликовал, где пики настолько близки друг к другу? –

+0

Это бизнес оценки для одномерных моделей гауссовой смеси, и я не похож на эксперта. Помимо этого, SO предназначен для программирования. Я бы предложил предварительный визит на http://stats.stackexchange.com/ для получения последних рекомендаций и, возможно, даже советов о том, какое программное обеспечение вы могли бы использовать. Удачи! –