【问题标题】:A small simulation study about normality tests in R关于 R 中的正态性检验的小型模拟研究
【发布时间】:2014-12-04 22:13:54
【问题描述】:

我正在进行一项小型模拟研究,以判断两个正态性检验到底有多好。我的计划是生成大量没有太多观察的正态分布样本,并确定每个测试拒绝正态性零假设的频率。

到目前为止我的(不完整的)代码是

  library(nortest)
  y<-replicate(10000,{
     x<-rnorm(50)
     ad.test(x)$p.value
     ks.test(x,y=pnorm)$p.value
   }
   )

现在我想计算每个测试中小于 0.05 的这些 p 值的比例。你能告诉我我该怎么做吗?如果这是一个新手问题,我深表歉意,但我自己是 R 新手。

谢谢。

【问题讨论】:

    标签: r statistics


    【解决方案1】:
     library(nortest)
     nsim <- 10000
     nx <- 50
    
     set.seed(101)
     y <- replicate(nsim,{
        x<-rnorm(nx)
        c(ad=ad.test(x)$p.value,
          ks=ks.test(x,y=pnorm)$p.value)
      }
     )
     apply(y<0.05,MARGIN=1,mean)
     ##     ad     ks 
     ## 0.0534 0.0480
    

    使用MARGIN=1 告诉apply 对行而不是列取平均值——考虑到replicate() 的内置简化产生的顺序,这是明智的。

    对于此类示例,任何标准测试的 I 类错误率将非常接近其标称值(本示例中为 0.05)。

    【讨论】:

    • PS 你可以通过一次选取所有 Normal 值并将它们放入矩阵中来加快速度...
    • 谢谢,就这样。如果我可能会问,你为什么将 1 作为第二个参数放在 apply 函数中?
    【解决方案2】:

    如果您分别运行每个测试,那么您可以简单地计算存储在 y 中的小于 0.05 的 val。

    y<-replicate(1000,{
         x<-rnorm(50)
         ks.test(x,y=pnorm)$p.value})
    length(which(y<0.05))
    

    【讨论】:

    • 谢谢,但我希望每个测试都在同一个样本上。
    【解决方案3】:

    您的代码没有输出 p 值。你可以这样做:

    rep_test <- function(reps=10000) {
    
      p_ks <- rep(NA, reps)
      p_ad <- rep(NA, reps)
    
      for (i in 1:reps) {
        x <- rnorm(50)
        p_ks[i] <- ks.test(x, y=pnorm)$p.value
        p_ad[i] <- ad.test(x)$p.value
      }
    
      return(data.frame(cbind(p_ks, p_ad)))
    }
    
    sum(test$p_ks<.05)/10000
    sum(test$p_ad<.05)/10000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2013-09-22
      • 2019-03-30
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多