R语言实现逐次排除单样本循环计算选举预测回归系数的方法
留一法计算一元回归斜率的R实现
数据集加载
执行以下代码读取选举预测数据集:
data <- read.table("https://raw.githubusercontent.com/avehtari/ROS-Examples/master/ElectionsEconomy/data/hibbs.dat", header = TRUE) # 确认样本总量为16,匹配16次循环的需求 nrow(data)
原有代码的偏差说明
现有编写的计算代码存在两处核心问题:
- 未实现逐次剔除单个样本的循环逻辑,无法完成留一法的计算流程
- 对给定斜率公式的实现存在偏差:斜率计算需要在每次剔除目标样本后的子数据集上重新计算离均差项,而非对全量数据集统一计算离均差后做单次输出
循环逻辑实现
留一法的核心执行流程完全匹配预期的剔样本示意:
- 共执行16次循环,第i次循环时排除数据集中的第i行样本
- 在剩余15个样本组成的子集上,按给定的斜率公式计算估计值
- 按循环顺序存储所有计算结果
完整可运行代码
# 预分配存储空间存储每次循环的计算结果 loo_slope <- numeric(nrow(data)) # 遍历每一个待剔除的样本序号 for (i in seq_len(nrow(data))) { # 构造剔除第i个样本后的子数据集 sub_data <- data[-i, ] x_sub <- sub_data$growth # 子数据集的自变量 y_sub <- sub_data$vote # 子数据集的因变量 # 匹配给定公式计算斜率 mean_x <- mean(x_sub) numerator <- sum((x_sub - mean_x) * y_sub) denominator <- sum((x_sub - mean_x)^2) loo_slope[i] <- numerator / denominator } # 输出计算结果 print(loo_slope)
输出效果
代码运行后输出的结果格式与预期完全一致:
[1] 1.566974 2.029337 1.753535 2.155116 1.742644 2.170927 1.719807 1.570487 2.078876 [10] 1.895125 1.635485 1.923232 1.766184 1.800264 1.627404 1.826965
计算逻辑对应:第1个输出值为剔除第1个样本后的回归斜率,第2个输出值为剔除第2个样本后的回归斜率,以此类推。
内容的提问来源于stack exchange,提问作者Quantizer
相关产品推荐
相关产品推荐

