我想计算分布的第n个时刻。我正在尝试在R中使用库'moment'的all.moments函数。我已经用这种方式测试了all.moments:
library(moments)
r<-rnorm(10000)
rr<-all.moments(r,order.max=4)
rr
[1] 1.000000000 0.002403360 0.962201478 -0.022694670 2.852696159
在我看来,这不是真的,因为我知道第3和第4时刻在正态分布中必须为0。 我的错误在哪里?
答案 0 :(得分:6)
第三个时刻是偏斜。你是对的:对于正态分布,这是零。由于您只是从正态分布中采样,因此结果将近似为零。
四阶矩是峰度。对于正态分布,这是3σ^ 4。在这种情况下,σ是1,所以你的结果应该是3,它就是。
要提高估算的准确性,请改善样本量。对于1e7观测的样本:
> library(moments)
> r <- rnorm(1e7)
> all.moments(r,order.max=4)
[1] 1.0000000000 0.0004028138 0.9995373115 0.0007276404 2.9976881271
答案 1 :(得分:1)
因为这只是期望而非准确,并且因为较高的时刻有很大的差异?
(参见@Andrie的答案,为什么第四个时刻(V5
以下)甚至不接近于零。)
> library(moments)
> R <- t(replicate(50,all.moments(rnorm(1e4),order.max=4)))
> summary(R)
V1 V2 V3 V4
Min. :1 Min. :-0.024921 Min. :0.9714 Min. :-0.0987174
1st Qu.:1 1st Qu.:-0.009527 1st Qu.:0.9911 1st Qu.:-0.0341950
Median :1 Median : 0.001021 Median :0.9994 Median : 0.0067138
Mean :1 Mean :-0.001047 Mean :1.0006 Mean :-0.0002613
3rd Qu.:1 3rd Qu.: 0.004711 3rd Qu.:1.0147 3rd Qu.: 0.0299731
Max. :1 Max. : 0.023356 Max. :1.0398 Max. : 0.1283456
V5
Min. :2.775
1st Qu.:2.921
Median :3.005
Mean :3.007
3rd Qu.:3.092
Max. :3.325
答案 2 :(得分:0)
我遇到了同样的问题,在python中工作,我认为计算机上浮点运算的精度有限,尤其是拥有大量的权力,也没有帮助。我将剪切并粘贴我的Python代码和我得到的结果。此代码尝试计算标准法线的前20个时刻。简而言之,我认为以数字方式计算分布的高阶矩并不容易,“高阶”意味着大于10左右。在一个单独的实验中,我尝试通过绘制越来越多的样本来减少我在第18时刻得到的方差,但这对于我的“普通”计算机来说是不切实际的。
N = 1000000
w = np.random.normal(size=N).astype("float128")
for i in range(20):
print i, mean(w**i) # simply computing the mean of the data to the power of i
给你:
0 1.0
1 0.000342014729693
2 1.00124397377
3 0.000140133725668
4 3.00334304532
5 0.00506625342217
6 15.0227401941
7 0.0238395446636
8 105.310071549
9 -0.803915389936
10 948.126995798
11 -34.8374820713
12 10370.6527554
13 -1013.23231638
14 132288.117911
15 -26403.9090218
16 1905267.02257
17 -658590.680295
18 30190439.4783
19 -16101299.7354
但正确的时刻是:1,0,1,0,3,0,15,0,105,0,945,0,10395,0,135135,0,2027025,0,34552525,0,654729075