如何编写拒绝R中Z分数的函数?
当zscore>=qnorm(1-alpha/2)用于10次模拟(alpha=0.05,样本量为10)时,如何编写返回“拒绝”的函数。我编写了以下代码,但没有得到正确的输出。 “zscore”为检验统计量,t为正态,平均值和标准偏差为6/n。sims对应于要执行的模拟数量。此函数应模拟蒙特卡罗评估如何编写拒绝R中Z分数的函数?,r,function,simulation,skew,R,Function,Simulation,Skew,当zscore>=qnorm(1-alpha/2)用于10次模拟(alpha=0.05,样本量为10)时,如何编写返回“拒绝”的函数。我编写了以下代码,但没有得到正确的输出。 “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
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)
谢谢 您在模拟人生上的循环不正确。你能解释一下你想做什么吗
testsk <- function(n,alph,sims) {
t <- numeric(sims)
for (i in seq_along(sims)) {
x <- rnorm(n)
t[i] <- skewness(x)
}
zscore <- t/(6/n)
if (any(zscore>=qnorm(1-alph/2))) {
print("REJECT")
}
return(zscore)
}
testsk(10,0.05,10)
testsk不确定您想要实现什么,但这里有一种方法可以做到这一点
testsk <- function(n, alph, sims){
for (i in 1:sims){
x <- rnorm(n)
zscore <- skewness(x)/(6/n)
cat(paste0("Simulation #", i,":"), ifelse(zscore >= qnorm(1 - alph/2), "REJECT", "Don't REJECT"), "\n")
}
}
n <- 10
alph <- .05
sims <- 10
testsk(n, alph, sims)
#Simulation #1: Don't REJECT
#Simulation #2: REJECT
#Simulation #3: Don't REJECT
#Simulation #4: Don't REJECT
#Simulation #5: Don't REJECT
#Simulation #6: Don't REJECT
#Simulation #7: Don't REJECT
#Simulation #8: Don't REJECT
#Simulation #9: Don't REJECT
#Simulation #10: Don't REJECT
testsk编辑之后,我相信您想做的是查看在sims
试验中,从正态分布中提取的大小n
样本计算出的偏度有多少次会被alph
水平的显著性检验拒绝
您有几个编码问题
您希望对每个试验都进行z分数测试,但测试是在循环之外的
z分数是使用向量t
计算的,但您希望使用标量t[i]
计算它
循环中有一个return
语句,它将导致函数在循环的第一次迭代中终止,返回z分数。出于第二个原因,z分数是一个向量,但它的倒数第二个值都是零,因为您只运行了一次迭代,因此函数的典型输出如下
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)
}
0.003623371 0.000000000 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是偏度()方差的估计值,但您需要标准偏差,因此需要取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)
}
库(e1071)
testsk=函数(n,alph,sims){
#在一个矩阵中生成随机数,每个试验是一行
X=矩阵(rnorm(sims*n),ncol=n)
#获取歪斜,1表示应用于行
倾斜=应用(X,1,倾斜)
#计算z得分向量和拒绝向量
zscore=skews/sqrt(6/n)
拒绝=!(qnorm(alph/2)
您应该能够修改它以满足您的目的,但如果必要,我可以澄清。您的'}'太多了。找一个真正的代码编辑器来避免这种错误(例如:rstudio)。我不清楚你想要实现什么。我可以看到,您正试图从标准正态分布中重复获取n
组样本,并计算每个组的偏度,将setI
的偏度存储在t[I]
中。但是z分数是多少?它应该是一个向量还是一个标量,你如何定义它?在任何情况下,我看不出从for
循环的中间返回有什么意义。我不确定seq_-along(sims)
。变量sims
是一个标量,原始的1:sims
似乎更好。