R语言sample/replicate抽样均值直方图代码报错求解
代码错误排查
你的两段代码核心问题如下:
- 初始版本逻辑错误:仅完成了1次抽样、算出1个固定均值,后续
replicate(100, dun)只是把这一个固定值重复复制100次,没有执行重新抽样的操作,得到的结果完全不是100次独立抽样的均值。 - for循环版本有三个致命问题:
- R语言中
for结构本身不返回计算结果,直接把循环整体赋值给d只会得到空值NULL - 循环内部多余写了
c <- replicate(100, dun),每次循环都会把当前单次算出的均值重复100次,完全不符合需求,还会覆盖变量 - 没有预先分配存储结果的向量,每次算出的抽样均值没有存到指定位置,循环跑完不会保留有效计算结果
- R语言中
- 额外问题:你用
c作为变量名,会覆盖R内置的向量合并函数c(),容易引发后续代码的隐性报错。
可运行修正代码
首先先基于你提供的房价数据构造测试数据集(如果你的环境里已经有完整的rome数据集可以跳过这步):
good_struct <- c( 47,113,165,104.3,62.5,70,127.5,64.5,145,63.5,58.9,65,48,3.5,12.8,17.5,36,41.9,53.5,24.5,24.5,55.5,60,51,46,46,44,54.9,42.5,44,44.9,37.9,33,43.9,49.6,52,37.5,50,35.9,42.9,107,112,44.9,55,102,35.5,62.9,39,110,8,62,85.9,57,110,67.7,89.5,70,74,13,48,24,53.5,34.5,53,87.5,33.5,24,9.6,30,41,30,38.9,20.7,49.9,18.6,39,34,16,18.9,15.2,41.5,53,22,24.9,6.7,32.5,30,59,29.5,26,16.5,39,48.9,33.5,46,54,57.9,37.9,32,31,34,29,32.5,51.9,31,41.8,48,28,35,46.5,51.9,35.4,16,35,35,36.5,35.9,45,40,35,38,37,23,25.5,39.5,21.5,9,67.5,13.4,12.5,28.5,23,33.5,9,11,30.9,31.65,33,33.4,47,40,46,45.5,57,29.9,30,34,51,64.5,57.5,85.5,61,38,56.5,60.4,51.5,54,69,56,27.9,37.5,32.9,22,29.9,39.9,32.6,38.5,21.5,25.9,27.5,22.9,31.5,8.5,5.5,33,57,47,43.5,43.9,68.5,44.25,61,40,44.5,57,35,35.1,64.5,40,42.6,50,58,58,55,43,54,39,45,42,38.9,43.215,26.5,30,29.5 ) # 构造rome数据集 rome <- data.frame(PRICE = good_struct)
你要求的for循环实现版本
# 预先创建长度为100的数值型向量,存储每次抽样的均值结果 d <- numeric(100) for(i in 1:100){ # 无放回抽取100个房屋样本 run <- rome[sample(1:nrow(rome), 100, replace = FALSE), ] # 计算当前批次均值,存入结果向量对应位置 d[i] <- mean(run$PRICE) } # 绘制直方图 hist(d, main = "100次重复抽样的房价均值分布", xlab = "样本房价均值", col = "lightblue")
更简洁的replicate实现版本(无需显式写循环)
d <- replicate(100, { run <- rome[sample(1:nrow(rome), 100, replace = FALSE), ] mean(run$PRICE) }) hist(d, main = "100次重复抽样的房价均值分布", xlab = "样本房价均值", col = "lightblue")
补充说明
- 你提供的
good_struct共包含200条房价数据,每次无放回抽取100条符合抽样逻辑;如果你的真实数据集行数小于100,需要将抽样参数改为replace = TRUE(有放回抽样),否则会触发抽样长度报错。 - 代码运行后你会得到接近正态分布的均值直方图,这是中心极限定理的直观表现。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

