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)