按照你的编辑,我相信你想做的事就是看有多少次了sims
试验根据从正态分布获得的样本计算的偏度将被拒绝,因为在alph
水平上的显着性检验也偏斜。
你有几个编码问题
- 您想为每一个审判做Z值测试,但测试是外循环。
- z分数是使用向量
t
计算得出的,但是您想使用标量t[i]
来计算z分数。
循环内部有一个return
语句,它将导致函数在循环的第一次迭代中终止,返回z分数。对于没有2.的原因,z分数是矢量,但其倒数第二个值都为零,因为您只运行一次迭代,因此该函数的典型输出如下
0.003623371 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
在下面的代码
library(e1071)
testsk=function(n,alph,sims) {
t=numeric(sims)
for (i in 1:sims) {
x=rnorm(n)
t[i]=skewness(x)
zscore=t[i]/(6/n)
if(zscore>=qnorm(1-alph/2)){
print("REJECT")
}
}
}
然而,这STIL一些患有修复这些眼前的问题结果问题:
- 但从
- 打印出“拒绝”编程点给出即时的反馈,但也不是很可扩展性。如果你有
sims=1000
,你最好还是拒收数量nr
。如果你仍然想打印出“拒绝”nr
次你可以这样做:)
- 此外,代码可能更简单,并写入更多的R风格,矢量化,而不是使用循环。这也会有更多更快的优势。因为R是一种解释型语言,所以矢量化会产生巨大的差异,因为数字处理可能会在引擎盖下发生,而R不必一遍又一遍地遍历您的
for
循环。
- 也许更严重的是,有一些统计问题:
- 6/n是偏度(wikipedia)的方差的估计,但你想要的标准偏差,所以你需要采取的平方根6/n。
- 如果z分数大于
1-alph/2
th分位数,则代码拒绝,但如果z分数小于alph/2
th分位数,它也应拒绝。因为它代表你的拒绝区域是alph/2
而不是alph
。
- 也可能有其他问题,但在我看来,这些是主要的问题。 (我假设你知道,6/n是只有方差大样本的一个很好的估计。)
一种程序,它是沿着正确的线路如下
library(e1071)
testsk=function(n,alph,sims) {
# Generate random numbers in a matrix, each trial is a row
X=matrix(rnorm(sims*n), ncol=n)
# Get skewnesses, 1 means apply to rows
skews=apply(X,1,skewness)
# Calculate z score vector and rejection vector
zscore=skews/sqrt(6/n)
reject=!(qnorm(alph/2) < zscore & zscore < qnorm(1-alph/2))
# Return the number of rejections
sum(reject)
}
您应该可以对其进行修改以适合您的目的,但如有必要,我可以澄清。
你有太多的'}'。得到一个真正的代码编辑器来避免这种错误(例如:rstudio)。 – Jealie
我不清楚你想达到什么目的。我可以看到你试图从一个标准的正态分布中重复获取'n'个样本集,并且计算每个集合的偏度,将集合'i'的偏度存储在't [i]'中。但是什么是Z分数?它应该是一个矢量还是一个标量,你怎么定义它?在任何情况下,我都看不出像你现在这样从'for for'循环的中间返回它是有意义的。 – TooTone