将Python Scipy truncnorm模型拟合到观察值然后进行采样

时间:2014-08-25 16:04:12

标签: python python-2.7 statistics scipy random-sample

我正在努力使用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。 附:我希望这是一个编码问题,而不是统计问题 - 这就是我在这里发布的原因。

model1 model2 model3 Fitted

- 2014年8月28日更新 - 这篇文章的想法是看到scipy.stats.truncnorm.fit方法获得一些帮助,并且在几天内,我已经构建了自己的笨重算法。从我与Robert的讨论中,我得到的印象是,截断方式的R或标准实现只需要3个参数。对于后来这篇文章的人来说,一旦scipy有一个改进的拟合引擎,这就是我估计的(假设我们想要一个渐近的右尾)。

enter image description here

0 个答案:

没有答案