奇怪的all.moments()结果

时间:2013-01-01 22:30:22

标签: r statistics

我想跟进前面提到的有关all.moments包中moments功能的问题:all.moments function weird outcome

all.moments输出的分布 - 特别是渐近方差 - 在第3和第4时刻似乎与标准理论不一致,或者我做错了。

请考虑以下代码:

reps <- 100000                              # number of repetitions
n <- 1000000                                # sample size
asy.cmtx <- matrix(0,nrow=reps,ncol=5)      # initialize our matrix of conventional moments
for(i in 1:reps){
vec <- rnorm(n,mean=0,sd=1)               # create vector of 1M standard normals
asy.cmtx[i,] <- all.moments(vec,order.max=5)[2:6]    # get sample moments 
}
mean(asy.cmtx[,3])             # this should be 0
# [1] 3.972406e-06
mean(asy.cmtx[,4])            # this should be 3
# [1] 2.999996
var(sqrt(n)*asy.cmtx[,3]/(asy.cmtx[,2]^(3/2)))     # this should be 6
# [1] 14.41766
var(sqrt(n)*(asy.cmtx[,4]-3)/(asy.cmtx[,2]^(2))) # this should be 24
# [1] 96.25745

渐近方差似乎大于预期。

我回去后简单地使用了我们都知道的样本矩公式并得到了正确的结果:

reps <- 100000                              # number of repetitions
n <- 1000000                                # sample size
asy.34.2 <- matrix(0,nrow=reps,ncol=2)      # initialize our matrix of conventional moments
for(i in 1:reps){
y <- rnorm(n,mean=0,sd=1)               # create vector of 1M standard normals
y.bar <- mean(y)
m2 <- ((1/n)*sum((y-y.bar)^2))
asy.34.2[i,1] <- ((1/n)*sum((y-y.bar)^3))/(m2^(3/2))
asy.34.2[i,2] <- ((1/n)*sum((y-y.bar)^4))/(m2^2)
}

mean(asy.34.2[,1])
# [1] 7.512593e-06
mean(asy.34.2[,2])
# [1] 2.999985
var(sqrt(1000000)*asy.34.2[,1])     # this should be 6
# [1] 5.990771
var(sqrt(1000000)*(asy.34.2[,2]-3)) # this should be 24
# [1] 24.23367                    

因此,实际公式具有我们期望的方差,但是all.moments没有,即使它具有适当的期望。由于样本大小或迭代次数,这不应该是一个问题,因为在这种情况下两者都很大(在两种情况下分别为1M和100k)。以前有人有这个问题吗?

此外,有没有人有R问题只是放弃你的输出?当我试图操纵上面的输出时,输出&#34;消失了#34;,dim = NULL。但是,如果我做的第一件事就是write.csv()数据,那么我可以将其读回并操作而不会消失。

1 个答案:

答案 0 :(得分:1)

有两个错误:(1)当flodel指出你需要中心时刻而不是原始时刻时,这对于时刻的点估计没有太大的区别,但它确实对它们的方差估计产生了影响; (2)使用all.moments时计算峰度时存在错误。当我们应用这些更正时,我们有:

reps <- 1000                              
n <- 100000

...

    asy.cmtx[i,] <- all.moments(vec,order.max=5, central = TRUE)[2:6]

...

var(sqrt(n)*asy.cmtx[,3]/(asy.cmtx[,2]^(3/2)))     # this should be 6
# [1] 5.993772
var(sqrt(n)*(asy.cmtx[,4])/(asy.cmtx[,2]^(2)) - 3) # this should be 24
# [1] 23.89204