我想创建一个具有三个参数的函数:样本数量,样本数量,伯努利试验中成功的真实p。
此函数将输出以下结果:p的平均估计值(即每个样本的p估计值的平均值),真实标准差的平均估计值(即每个样本的sd估计值的平均值)和最后是95%CI包含真实p的样本比例。
我想出了以下代码:
draw_function <- function(si=1, proba= 0.5){
sample_draw <- rbinom(n= si, 1, prob= proba)
mean_estimate <- mean(sample_draw)
s_estimate <- sqrt(mean_estimate*(1-mean_estimate))
confidence_interval <- list(c(mean_estimate -
1.96*s_estimate/sqrt(si), mean_estimate + 1.96*s_estimate/sqrt(si)))
list(mean_sample = mean_estimate, s_sample = s_estimate, c_sample =
confidence_interval)
}
draw_sample <- function(s=1, r=1, p=0.5) {
for (i in 1:r) {
inter <- list(mean_p=c(), mean_s = c(), mean_c = c() )
samp <- draw_function(si=s, proba= p)
inter$mean_p = c(inter$mean_p, samp$mean_sample)
inter$mean_s = c(inter$mean_s, samp$s_sample)
inter$mean_c <- c(inter$mean_c, samp$c_sample)
if ( inter[[3]][1] > p & inter[[3]][2] < p ) {
mean_c <- (mean_c + 1)/i
}
else {
meanc <- (mean_c + 0)/i
}
}
return(list(mean(inter$mean_p), mean(inter$mean_s), inter$mean_c))
但是,即使修改了引起我注意的错误,此代码也无法正常工作。
我不断收到此错误:
draw_sample中的错误(s = 30,r = 1000,p = 0.05):
(列表)对象不能强制输入“ double”
因此,我想寻求您的帮助以发现问题并建立这样的功能!谢谢!
答案 0 :(得分:0)
该错误在以下部分中发生:
inter[[3]][1] > p & inter[[3]][2] < p
使用browser()或逐行运行代码,您会发现
confidence_interval <- list(c(mean_estimate - 1.96*s_estimate/sqrt(si),
mean_estimate + 1.96*s_estimate/sqrt(si)))
本身返回一个列表。因此,如果您想自己准备零件,则分别为inter[[3]][[i]][1]
和inter[[3]][[i]][2]
。
可以进行一些优化,最近我可能会用一些建议来编辑此注释。 :-)
:::编辑:::
稍微深入一点的答案。
R中的r[dens]
函数具有一些与之相关的开销。作为加快代码速度的一种简单方法,就是一次运行所有模拟,然后以巧妙的方式对子集执行计算。下面显示了一种方法(如果模拟在内存限制内),则将所有内容插入矩阵,然后使用rowMeans快速计算必要的信息。
draw_sample <- function(s = 1, r = 1, p = .5){
samples <- matrix(rbinom(n = r * s, size = 1, p = p), ncol = s, nrow = r, byrow = TRUE)
mean_p <- rowMeans(samples)
mean_s <- mean_p * (1 - mean_p)
bound = 1.96 * mean_s / sqrt(s)
mean_c <- mean(ifelse(mean_p - bound < p & mean_p + bound > p, 1, 0))
list(mean_p = mean(mean_p), mean_s = mean(mean_s), mean_c = mean_c)
}