Python中拟合参数分布的匹配矩不准确

Python中拟合参数分布的匹配矩不准确,python,statistics,distribution,normal-distribution,data-fitting,Python,Statistics,Distribution,Normal Distribution,Data Fitting,在下面的代码中,我生成了一个随机变量x,我知道它是正态分布的,因此我将参数正态分布拟合到它(通过参数的最大似然估计),以便模拟一个名为y的合成变量,该变量应该与原始数据的属性相匹配。x和y的统计矩(平均值、标准偏差)也应匹配 那么为什么y分布的矩与x分布的矩不匹配呢?在下面的一次代码运行中,y(0.052)的平均值可能是x(0.01)的5倍,有时甚至是负值 import numpy as np from scipy.stats import norm n = 2000 x = norm.rvs

在下面的代码中,我生成了一个随机变量
x
,我知道它是正态分布的,因此我将参数正态分布拟合到它(通过参数的最大似然估计),以便模拟一个名为
y
的合成变量,该变量应该与原始数据的属性相匹配。
x
y
的统计矩(平均值、标准偏差)也应匹配

那么为什么
y
分布的矩与
x
分布的矩不匹配呢?在下面的一次代码运行中,
y
(0.052)的平均值可能是
x
(0.01)的5倍,有时甚至是负值

import numpy as np
from scipy.stats import norm

n = 2000
x = norm.rvs(size=n)
y = norm(*norm.fit(x)).rvs(size=n)

for i in [x,y]:
    print("mu={:.4f}, sd={:.4f}".format(np.mean(i), np.std(i)))
那么为什么y分布的矩与x的矩不匹配呢 分配

它们确实存在,或者至少在预期误差范围内存在(1)

一个快速的观察结果是它们都接近标准正态分布;它们的第一个矩都接近于0,第二个矩接近于1。但是,请注意,x是从
N(0,1)
中采样的,y是从
N(平均值(x),标准值(x))中采样的

大样本量 如果希望它们的值更接近,而不是简单地增加样本大小
n
。我们将修复再现性2的
随机状态

这将产生:

Trial 0
mu=0.0033, sd=0.9980
mu=0.0067, sd=0.9960
Trial 1
mu=0.0045, sd=0.9977
mu=0.0089, sd=0.9953
Trial 2
mu=-0.0004, sd=0.9981
mu=-0.0008, sd=0.9963
Trial 3
mu=-0.0019, sd=0.9965
mu=-0.0037, sd=0.9930
Trial 4
mu=-0.0052, sd=0.9992
mu=-0.0104, sd=0.9984
小样本量 对于小样本量
n
,我们自然希望
x
y
之间存在一些差异,因为我们实际上是从
y
中提取另一个样本。但是,我们可以观察拟合参数的行为是否符合预期,如下所示:

n = 200
for i in range(5):
    x = norm.rvs(size=n, random_state=i)    
    print("Trial {}".format(i))
    print(np.mean(x), np.std(x), norm(*norm.fit(x)).args)
这就产生了

Trial 0
0.07091049314116117 1.0214227686959954 (0.07091049314116117, 1.0214227686959954)
Trial 1
0.1066888148479486 0.9100459829739235 (0.1066888148479486, 0.9100459829739235)
Trial 2
0.012250008696874187 1.0800421002497833 (0.012250008696874187, 1.0800421002497833)
Trial 3
-0.07079063505988327 0.9767123391405987 (-0.07079063505988327, 0.9767123391405987)
Trial 4
0.028540839305884236 0.9537561748836348 (0.028540839305884236, 0.9537561748836348)

(1) 没有实际计算标准误差,所以如果我错了,请纠正我。在上快速搜索可以很好地解释一般情况


(2) 修正随机状态
x
norm(*norm.fit(x))
并不意味着后者的随机样本应产生
N(均值(x),标准(x))
。然后,再次提到上面的(1)为什么应该?

在我的原始代码中,我如何制定第二种方法来修复
随机状态
?它是否比您的答案中描述的第一种增加样本量的方法更准确?在我的应用程序中,
n=50
的小样本是正常的,我刚刚意识到我关于随机状态的说法是错误的!是什么?您是否收回了
random_state
方法?当尝试将力矩与参数分布匹配时,有关小样本设置的任何注释都会更新脚注中的第一项。请注意,我的回答的后半部分显示拟合参数正好是
mean(x)
std(x)
。因此,这实际上是一个问题:“给定
N(a,b)
,N应该有多大才能使样本均值和标准差足够接近
a
b
”。我将删除我对
random state
的评论,因为它现在已经在问题中得到了解决,而且还因为它的措辞很糟糕,可能会产生误导。
Trial 0
0.07091049314116117 1.0214227686959954 (0.07091049314116117, 1.0214227686959954)
Trial 1
0.1066888148479486 0.9100459829739235 (0.1066888148479486, 0.9100459829739235)
Trial 2
0.012250008696874187 1.0800421002497833 (0.012250008696874187, 1.0800421002497833)
Trial 3
-0.07079063505988327 0.9767123391405987 (-0.07079063505988327, 0.9767123391405987)
Trial 4
0.028540839305884236 0.9537561748836348 (0.028540839305884236, 0.9537561748836348)