(著)山たー
とりあえず書いた。平均と分散の信頼区間も出せるようにした。
結果
Estimate lwCI upCI mu -0.039926 -0.04378 -0.036072 sigma 0.980826 0.85298 1.093508
コード
import numpy as np import matplotlib.pyplot as plt import pandas as pd from scipy.stats import t, chi2 # mean and standard deviation mu, sigma = 0, 1 # generate toy data s = np.random.normal(mu, sigma, 500) # estimated value e_mu = np.mean(s) S2 = np.var(s, ddof=1) e_sigma = np.sqrt(S2) # plot histgram count, bins, ignored = plt.hist(s, 30, density=True) # true curve truth = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (bins - mu)**2 / (2 * sigma**2)) # fitted cureve estimated = 1/(e_sigma * np.sqrt(2 * np.pi)) *np.exp( - (bins - e_mu)**2 / (2 * e_sigma**2) ) # plot result plt.plot(bins, truth, linewidth=2, label ="true curve" ,color='r') plt.plot(bins, estimated, linewidth=2, label ="estimated curve", color='b') plt.tight_layout() plt.legend() plt.savefig("test.png") plt.show() # estimate 95% confidence interval of mu # use t distribution alpha = 0.025 n = len(s) StdError = e_sigma / n t_q = t.isf(q=alpha, df=n-1) mu_CI = (e_mu - t_q*StdError, e_mu + t_q*StdError) # estimate 95% Confidence interval of mu # use chi2 distribution chi2_q_lower = chi2.isf(q=alpha, df=n-1, loc=0, scale=1) chi2_q_upper = chi2.isf(q=1-alpha, df=n-1, loc=0, scale=1) sigma_CI = ((n-1)*S2/chi2_q_lower, (n-1)*S2/chi2_q_upper) # print result mat = np.vstack(((e_mu,e_sigma), (mu_CI[0],sigma_CI[0]), (mu_CI[1],sigma_CI[1]))) df = pd.DataFrame(mat.T, index=["mu", "sigma"], columns=("Estimate", "lwCI","upCI")) print(df)
コメントをお書きください