如何编写拒绝R中Z分数的函数?

如何编写拒绝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

当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)
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
    组样本,并计算每个组的偏度,将set
    I
    的偏度存储在
    t[I]
    中。但是z分数是多少?它应该是一个向量还是一个标量,你如何定义它?在任何情况下,我看不出从
    for
    循环的中间返回
    有什么意义。我不确定
    seq_-along(sims)
    。变量
    sims
    是一个标量,原始的
    1:sims
    似乎更好。