我正在努力使用Scipy truncnorm fit方法,我很感激帮助,以使拟合参数系数与观察数据一致。
作为一个例子,我从N(0,1)分布的右手尾部(观察值大于2 stdev)创建了一个小样本,并抛出了一些异常值。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import truncnorm
values = np.array([2.01, 2.06, 2.71, 2.31, 2.58, 2.17, 3.03, 2.24, 2.12,
2.72, 2.46, 2.66, 2.49, 3.41, 2.46, 2.12, 2.12, 2.65,
2.32, 2.49, 5.15, 2.62, 2.48, 2.27, 2.05])
pd.Series(values).describe()
然后生成以下摘要统计信息:
count 25.000
mean 2.548
std 0.633
min 2.01
25% 2.17
50% 2.46
75% 2.65
max 5.15
为了说明我使用scipy fit方法的问题并更好地理解truncnorm实现,我已经构建了以下直观模型,从检查上述摘要统计和采样直方图到观察值(见下图)。我正在努力解决的问题是,当我尝试使用估计参数进行采样时,拟合方法会产生如此糟糕的结果?如果我没有正确使用拟合结果或出现其他错误,我会很感激帮助改造?
构建这些示例的代码:
size = 10000
bins = 30
intuitive_models = {"model1":(2, 5),
"model2":(1, 4, 1),
"model3":(0.8, 4, 1, 1.25),
"fitted":truncnorm.fit(values)}
# store the tuncnorm random sample into a dict
model_results = dict()
for model, params in intuitive_models.items():
model_results[model] = truncnorm(*params).rvs(size)
# plot the random sample vs the oserved values
for model, params in intuitive_models.iteritems():
plt.figure()
plt.hist(model_results[model], bins=bins, normed=True)
plt.title(model + ': ' + repr(params))
plt.hist(values, normed=True, alpha=0.5)
# tabular comparison
print pd.DataFrame(model_results).describe()
产生了以下表格数据:
fitted model1 model2 model3
count 10000.000000 10000.000000 10000.000000 10000.000000
mean 1.024707 2.372819 2.524923 2.698601
std 0.014362 0.333144 0.443857 0.584215
min 1.000019 2.000040 2.000007 2.000019
25% 1.012248 2.121838 2.181642 2.245088
50% 1.024518 2.280975 2.407814 2.557983
75% 1.036996 2.534782 2.757778 2.998948
max 1.049991 4.829619 4.982337 5.905201
谢谢Bertie。 附:我希望这是一个编码问题,而不是统计问题 - 这就是我在这里发布的原因。
- 2014年8月28日更新 - 这篇文章的想法是看到scipy.stats.truncnorm.fit方法获得一些帮助,并且在几天内,我已经构建了自己的笨重算法。从我与Robert的讨论中,我得到的印象是,截断方式的R或标准实现只需要3个参数。对于后来这篇文章的人来说,一旦scipy有一个改进的拟合引擎,这就是我估计的(假设我们想要一个渐近的右尾)。