关于R中正态性检验的小型仿真研究

时间:2014-12-04 22:13:55

标签: r statistics

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

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

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

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

谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您的代码未输出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