绘制Bootstrapped数据的置信区间宽度与样本量关系图
问题根源分析
你代码里的核心错误是计算了同一个变量与自身的相关系数:cor.test(baseRan$Ranpopsize[r], baseRan$Ranpopsize[r])。这种情况下,两个变量完全一致,相关系数必然是1,对应的置信区间宽度会趋近于0(也就是你看到的极小值),完全偏离了你原本的分析目标。
修正方案
首先明确你的核心需求:基于已有的1000个Bootstrap种群估计值,分析不同样本量下某个统计量(比如均值、或者真正的双变量相关)的置信区间宽度变化。以下针对两种常见场景给出修正代码:
场景1:估计Ranpopsize均值的置信区间宽度
这是最符合你“种群估计值”描述的场景,代码调整如下:
set.seed(144) # 定义样本量序列,按你的需求设置步长 sample_sizes <- seq(10, 1000, 20) # 循环计算每个样本量对应的平均置信区间宽度 ci.widths <- sapply(sample_sizes, function(n) { mean(replicate(1000, { # 从1000个Bootstrap估计值中抽取n个样本(有放回抽样符合Bootstrap逻辑) boot_sample <- sample(baseRan$Ranpopsize, n, replace = TRUE) # 计算均值的95%置信区间 ci <- t.test(boot_sample)$conf.int # 计算区间宽度 diff(ci) })) }) # 绘制折线图(比散点图更直观展示趋势) plot(sample_sizes, ci.widths, xlab = "样本量", ylab = "置信区间宽度", type = "l", main = "置信区间宽度随样本量变化趋势")
场景2:估计两个变量的相关系数置信区间宽度
如果你原本的目标是分析两个变量的相关性,只需确保传入cor.test的是两个不同变量即可:
set.seed(144) sample_sizes <- seq(10, 1000, 20) ci.widths <- sapply(sample_sizes, function(n) { mean(replicate(1000, { # 抽取行索引,同时获取两个变量的样本 r <- sample(nrow(baseRan), n, replace = TRUE) ci <- cor.test(baseRan$VarA[r], baseRan$VarB[r])$conf.int diff(ci) })) }) plot(sample_sizes, ci.widths, xlab = "样本量", ylab = "相关系数置信区间宽度", type = "l")
额外注意点
如果你的baseRan是从原始n=30样本生成的1000个Bootstrap估计值,若想模拟“从原始总体中抽取不同大小样本”的场景,应该基于原始30个样本重新进行Bootstrap抽样,而非从已有的1000个估计值中抽取——这取决于你的实验设计逻辑。
内容的提问来源于stack exchange,提问作者PeterLL
相关产品推荐
相关产品推荐

