当zscore> = qnorm(1-alpha / 2)10次模拟alpha = 0.05和样本大小10时,如何编写一个返回“reject”的函数 . 我写了下面的代码,但我没有得到校正输出 . “zscore”是检验统计量,t是正态的,平均值和标准差为6 / n . sims对应于要执行的模拟次数 . 此功能应模仿蒙特卡罗评估 .
testsk=function(n,alph,sims){
t=numeric(sims)
for (i in 1:sims) {
x=rnorm(n)
t[i]=skewness(x)
zscore=t/(6/n)
return(zscore)
}
if(zscore>=qnorm(1-alph/2)){
print("REJECT")
}
}
testsk(10,0.05,10)
谢谢!
3 回答
在您编辑之后,我相信您要做的是查看
sims
试验从正态分布中获取的样本偏差计算的偏差量将被拒绝,因为alph
级别的显着性测试过于偏斜 .你有几个编码问题
您希望为每个试验进行z分数测试,但测试不在循环中 .
使用向量
t
计算z得分,但您想使用标量t[i]
计算它 .循环内部有一个
return
语句,它将导致函数在循环的第一次迭代中终止,返回z分数 . 原因是2,z得分是一个向量,但它的倒数第二个值都是零,因为你只运行了一次迭代,所以函数的典型输出如下0.003623371 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
修复这些直接问题会导致以下代码
然而,这个stil有一些问题:
从编程的角度来看
打印"REJECT"提供即时反馈,但不是很可扩展 . 如果你有
sims=1000
,你最好还是拒绝拒绝的次数,nr
. 如果你还想打印"REJECT"nr
次,你可以这样做:)此外,代码可以更简单,并以更多的R样式编写,矢量化而不是使用循环 . 这也具有更快的优点 . 因为R是一种解释型语言,所以矢量化产生了巨大的差异,因为数字运算可以在引擎盖下发生,而R不必反复遍历
for
循环 .或许更严重的是,存在一些统计问题:
6 / n是偏度方差的估计值(wikipedia),但是您需要标准偏差,因此需要采用6 / n的平方根 .
如果z分数大于
1-alph/2
分位数,则代码拒绝,但如果z分数小于_733990分位数,则代码也应拒绝 . 因为它是你的拒绝区域是alph/2
而不是alph
.可能还有其他问题,但我认为这些是主要问题 . (我假设你知道6 / n只是对大样本方差的一个很好的估计 . )
沿着右边的程序如下
你应该能够修改它以适合你的目的,但我可以在必要时澄清 .
不确定你想要实现什么,但这是你可以做到这一点的一种方式
您错误地循环
sims
. 你能解释一下你想做什么吗?