微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R中汇总数据置信区间的计数器循环

如何解决R中汇总数据置信区间的计数器循环

我正在尝试使用 for 循环作为重复计数器向测试样本添加摘要数据。我尝试使用 data.frame、矩阵和向量将我的数据推出 for 循环并填充表格。我得到的最好的方法是填充向量中的一整列,并完成数据框中除一行之外的所有列。

#try empty vector to populate 
large.sample.df <- vector(mode = "double",length = 1000)

#try matrix to populate 
large.matrix <- matrix(nrow = 1000,ncol = 3)
matrix.names <- c("mean","lwr","upr")
colnames(large.matrix) <- matrix.names

#Try dataframe to populate
large.df <- data.frame(mean="",lwr="",upr="")

#set total length
n <- length(large.sample.df)

#use functions to calculate confidence interval
lwr.ci <- function(a) (mean(a) - 1.96 * (sd(a)/sqrt(length(a))))
upp.ci <- function(a) (mean(a) + 1.96 * (sd(a)/sqrt(length(a))))

#Start new seed count
set.seed(1234)

#begin for loop for mean,lwr,upr CI
for (i in 1:n) {
  large.sample <- rgamma(n = 1000,shape = 4,rate = 2)
  large.df$mean[i] <- mean(large.sample)
  large.df$lwr[i] <- lwr.ci(large.sample)
  large.df$upr[i] <- upp.ci(large.sample)
  }

解决方法

这里有两种方法可以获得您想要的东西。首先要区分样本量和样本数:

set.seed(1234)
n <- 1000
samples <- 10  # Keep this small for testing and then increase it
s <- 4
r <- 2

首先你的循环方法:

results <- data.frame(mean=NA,lwr=NA,upr=NA)   # Not "" which makes the variables character strings
set.seed(1234)
for (i in 1:samples) {
    x <- rgamma(n,shape = s,rate = r)
    mn <- mean(x)
    sder <- sd(x)/sqrt(n)
    lwr <- mn - 1.96 * sder
    upr <- mn + 1.96 * sder
    results[i,] <- c(mn,lwr,upr) 
}
results
#           mean         lwr         upr
# 1  2.015193688 1.952431714 2.077955663
# 2  2.024218250 1.962404608 2.086031891
# 3  2.008401293 1.948363928 2.068438658
# 4  1.993061142 1.932020588 2.054101696
# 5  1.975824831 1.912961486 2.038688176
# 6  1.983761126 1.923583927 2.043938325
# 7  1.983166350 1.924890819 2.041441880
# 8  1.975453269 1.915336118 2.035570420
# 9  1.976118333 1.915025748 2.037210918
# 10 2.044088839 1.983435628 2.104742050

现在使用 replicate

confint <- function(n,s,r) {
    x <- rgamma(n,rate = r)
    mn <- mean(x)
    sder <- sd(x)/sqrt(n)
    lwr <- mn - 1.96 * sder
    upr <- mn + 1.96 * sder
    return(c(mean=mn,lwr=lwr,upr=upr))
}
confint(n,r)   # Test the function
#        mean         lwr         upr 
# 1.974328366 1.914003710 2.034653023 
set.seed(1234)
results <- replicate(samples,confint(n,r))
results <- t(results)
results
#              mean         lwr         upr
#  [1,] 2.015193688 1.952431714 2.077955663
#  [2,] 2.024218250 1.962404608 2.086031891
#  [3,] 2.008401293 1.948363928 2.068438658
#  [4,] 1.993061142 1.932020588 2.054101696
#  [5,] 1.975824831 1.912961486 2.038688176
#  [6,] 1.983761126 1.923583927 2.043938325
#  [7,] 1.983166350 1.924890819 2.041441880
#  [8,] 1.975453269 1.915336118 2.035570420
#  [9,] 1.976118333 1.915025748 2.037210918
# [10,] 2.044088839 1.983435628 2.104742050

两种方法都同意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。