计算&在模拟中绘制每代的自举置信区间

时间:2012-11-13 14:29:02

标签: r simulation confidence-interval

我在R中运行一个简单的遗传漂移模拟。

# Population size
N<-5000
# Number with focal allele
X1<-(N/2)
# Number of generations
ngens<-(2000)
# Number of replicates
nreps<-10

# Drift function
drift <- function(N, X1, ngens, nreps) {
# Makes a matrix of NA's of nreps columns, and ngen rows
       p <- matrix(NA, nrow=ngens, ncol=nreps)
  # Set base population
       p[1,] <- X1/N
  # Repetitive sampling function, each generation sample 10 times from the generation before (gen-1)  
       for(gen in 2:ngens)
         p[gen,] <- rbinom(n=nreps, size=N, prob=p[gen-1,]) / N
       p
}
# Run function "drift" & output as data frame
p <- data.frame(drift(N, X1, ngens, nreps))
# Plot
matplot(p, type="l", ylim=c(0,1), lty=1, xlab="Generations", ylab="Proportion Focal",col="grey")
# Mean value
p$mean<-apply(p[,c(1:10)],1,mean)
matplot(p$mean, type="l", ylim=c(0,1), lty=1, xlab="Generations", ylab="Proportion Focal",col="black",add=T)

我想:

  1. 计算每代平均值周围的置信区间(引导
  2. 在我的数据框中添加一对列,使用上下置信区间估计,然后可以在matplot上绘制,就像我使用平均值一样
  3. 有人可以建议一种方法吗?我知道我需要Boot包并且大致知道如何使用它,但指导会很好。

    问题(对我而言)是获得一个循环,为每一代模拟生成一个CI并将其粘贴到“p”数据框

    修改

    我试过这个,因为@bakyaw的部分建议和“for”循环改编自我曾经使用过的旧脚本。

    myBootFunction<-function(x){
      b <- boot(x, function(u,i) mean(u[i]), R = 999)
      boot.ci(b, type = c("norm"))
    }
    
    meanList<-apply(p[c(2:ngens),c(1:nreps)],1,function(x)myBootFunction(x))
    for(i in 1:49) {
      low<-meanList[[i]][[4]][[2]]
      high<-meanList[[i]][[4]][[3]]
      CIMatrix<-cbind(high,low)}
    

    注意添加c(2:ngens),但没有出现这个错误。

      

    [1]“t的所有值都等于0.5 \ n无法计算置信度   间隔“

    然而,这仍然只是将CIMatrix创建为1x2双矩阵,而不是每一代都有一个。

1 个答案:

答案 0 :(得分:0)

如果你已经解决了问题,这可以作为答案。 启动功能:

    library(boot)

    myBootFunction<-function(x){
        b <- boot(x, function(u,i) mean(u[i]), R = 999)
        boot.ci(b, type = c("norm", "basic", "perc"))
    }

然后代码中的这一行:p$mean<-apply(p[,c(1:10)],1,mean)

你可以使用:

meanList<-apply(p[,c(1:10)],1,function(x)myBootFunction(x))

获得具有置信区间的列表后,您可以将其转换为数据框,然后对其进行处理。