首页 文章

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

提问于
浏览
0

当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 回答

  • 0

    在您编辑之后,我相信您要做的是查看 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

    修复这些直接问题会导致以下代码

    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有一些问题:

    • 从编程的角度来看

    • 打印"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只是对大样本方差的一个很好的估计 . )

    沿着右边的程序如下

    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)
    }
    

    你应该能够修改它以适合你的目的,但我可以在必要时澄清 .

  • 1

    不确定你想要实现什么,但这是你可以做到这一点的一种方式

    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
    
  • 1

    您错误地循环 sims . 你能解释一下你想做什么吗?

    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)
    

相关问题