如何计算模拟中重要 p 值的数量?

How to count number of significant p-values in a simulation?

假设我有一项临床试验,其中有 32 只老鼠感染了一种疾病。我用我的治疗方法治疗了其中的 16 个,剩下的 16 个作为对照。在进行实验之前,我是运行一个模拟。我将从均匀 (0,1) 分布中抽取 32 个观察值。我想计算模拟结束后我实现 p 值 < 0.01 的次数。感觉差不多了,就是不知道怎么拼:

nSims <- 10000 #number of simulated experiments
p <-numeric(nSims) #set up empty container for all simulated p-values
sig<-0
for(i in 1:nSims){ #for each simulated experiment

   #generating 32 observations total from uniform(0,1) distribution
   control.year1 <- runif(16, min = 0, max = 1)
   treat.year1 <- runif(16, min = 0, max = 1)

   #Creating dichotomous variable for those get better/don't get better
   control.respond <- ifelse(control.year1<=0.05,1,0)
   treat.respond <- ifelse(treat.year1<=0.30,1,0)

   #perform t-test
   z <- t.test(control.respond,treat.respond) 
   p[i]<-z$p.value #get the p-value and store it

   # want to count number of significant p-values - not sure how to do it
   significance <- ifelse(z$p.value<= 0.01,sum(sig, 1),0)
}

这个解决方案不是最优雅的,但使用 magrittrdplyr 进行数据处理。首先,我创建了一个矩阵来保存您的模拟数据:

library(magrittr)
library(dplyr)

n <- 100
control.years <- as.data.frame(matrix(runif(16*n, min=0, max=1),ncol=16))
treat.years <- as.data.frame(matrix(runif(16*n, min=0, max=1),ncol=16))

然后我创建了一个数据结构来捕获所有 t 检验的 p 值:

for (i in 1:n) { p[i] <- t.test(control.years[i,],treat.years[i,])$p.value }

您可以过滤掉您喜欢的范围内的 p 值:

> as.data.frame(p) %>% filter(p<0.05)
       p
1 0.03173299
2 0.01652114
3 0.00471807

或者您可以创建一个新变量来告诉您是否重要:

> as.data.frame(p) %>% mutate(sig=ifelse(p<0.05,1,0)) 
             p sig
1   0.65233254   0
2   0.50731231   0
3   0.11657045   0
...
29  0.03173299   1

或者您可以找出有多少显着的 p 值:

> z <- as.data.frame(p) %>% mutate(sig=ifelse(p<0.05,1,0)) 
> table(z$sig)

 0  1 
97  3