将 Python Scipy truncnorm 模型拟合到观测值,然后采样

Ber*_*tie 5 python random statistics scipy python-2.7

我正在努力使用 Scipy truncnorm 拟合方法,我希望得到帮助,以便拟合的参数系数与观察到的数据一致。

作为示例,我从 N(0,1) 分布的右侧尾部创建了一个小样本(其中观测值大于 2 个标准差),并引入了一些异常值。

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()
Run Code Online (Sandbox Code Playgroud)

然后生成以下汇总统计数据:

count    25.000
mean      2.548
std       0.633
min       2.01
25%       2.17
50%       2.46
75%       2.65
max       5.15
Run Code Online (Sandbox Code Playgroud)

为了说明我在使用 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()
Run Code Online (Sandbox Code Playgroud)

产生以下表格数据:

             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
Run Code Online (Sandbox Code Playgroud)

谢谢伯蒂。ps 我希望这是一个编码问题而不是统计问题 - 这就是我将其发布在这里的原因。

型号1 型号2 型号3 已装

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

在此输入图像描述