我正在进行一项小型模拟研究,以判断两项常态检验的真实性。我的计划是生成大量不太多观察的正态分布样本,并确定每个测试拒绝正常性的零假设的频率。
我到目前为止的(不完整)代码是
library(nortest)
y<-replicate(10000,{
x<-rnorm(50)
ad.test(x)$p.value
ks.test(x,y=pnorm)$p.value
}
)
现在我想计算每次测试的这些p值小于0.05的比例。你能告诉我怎么做吗?如果这是一个新手问题我很抱歉,但我自己是R的新手。
谢谢。
答案 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