使用map_dbl()的两种R代码逻辑相似为何输出不同?
抽样误差计算结果不一致的原因解析
你在计算不同样本量的抽样误差时,两段逻辑看似一致的代码输出结果不同,核心原因在于随机数生成的状态未重置。
初始设置
set.seed(4) parameter <- mean(houses$SalePrice) # parameter value = 180796.1 sample_sizes <- seq(from = 5, by=29, length.out=100) library(purrr)
你的代码
sample_means <- map_dbl(sample_sizes, function(x) mean(sample(houses$SalePrice, size=x))) sampling_errors_a <- parameter - sample_means
参考代码
sampling_errors <- map_dbl(sample_sizes, function(x) parameter - mean(sample(houses$SalePrice, size=x)))
关键原因
R的随机数生成器有一个内部状态,每次调用sample()(或其他随机函数)时,这个状态会向前推进,生成下一组随机数。如果在同一个会话中先运行你的代码,会调用100次sample(),消耗掉前100组随机数;之后运行参考代码时,sample()会从第101组随机数开始生成样本,自然得到不同的抽样结果,最终导致误差值不一致。
验证方法
在运行每一段代码前重新设置随机种子,让两者的随机数起点一致:
# 运行你的代码 set.seed(4) sample_means <- map_dbl(sample_sizes, function(x) mean(sample(houses$SalePrice, size=x))) sampling_errors_a <- parameter - sample_means # 重置种子后运行参考代码 set.seed(4) sampling_errors <- map_dbl(sample_sizes, function(x) parameter - mean(sample(houses$SalePrice, size=x))) # 此时验证结果一致 identical(sampling_errors_a, sampling_errors) # 返回 TRUE
逻辑等价性
从数学计算上看,两段代码完全等价:
- 你的代码是先批量计算所有样本均值,再统一减去总体参数;
- 参考代码是在每次迭代中直接计算总体参数与样本均值的差值。
两者的计算逻辑没有差异,差异仅来自随机抽样的随机性(随机数状态未重置导致的样本不同)。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

