R中使用bootstrap计算高斯核KNN模型b估计值95%置信区间的方法
原有代码问题排查
- 函数名拼写不一致:定义的函数名为
bot.kn,传入boot时写为boot.kn,直接触发报错 - 拟合数据集用错:
train.kknn传入的是原始数据集data,没有用到bootstrap抽取出的重抽样样本d - 返回值不符合需求:原有代码返回
my.pred.stats的模型评估结果,你需要的是给定特定a值的预测值的置信区间,二者完全不匹配 - 固定k值无法做批量对比:写死
ks=5,没有预留兼容多k值的参数入口
修正后完整实现代码
1. 基础依赖和参数定义
library(kknn) library(boot) # 替换为你实际需要预测的特定a值 target_a <- 1005 new_data <- data.frame(a = target_a)
2. 重写bootstrap统计函数
boot_knn_pred <- function(formula, data, indices, k, newdata) { # 提取bootstrap重抽样样本 d_boot <- data[indices, ] # 基于重抽样样本拟合高斯核KNN fit <- train.kknn( formula = formula, data = d_boot, kernel = "gaussian", ks = k ) # 返回目标a值对应的b预测值,作为bootstrap统计量 return(predict(fit, newdata = newdata)) }
3. 最优k=5的置信区间计算
# 固定随机种子保证结果可复现 set.seed(123) bs_k5 <- boot( data = df, statistic = boot_knn_pred, R = 1000, formula = b ~ a, k = 5, newdata = new_data ) # 提取95% BCa置信区间 ci_k5 <- boot.ci(bs_k5, conf = 0.95, type = "bca") print(ci_k5)
4. 批量对比1-20所有k值的CI结果
# 初始化结果存储容器 ci_results <- list() # 遍历k=1到20批量计算 for (k in 1:20) { set.seed(123) # 固定种子保证不同k的抽样逻辑一致,对比结果更公平 bs_obj <- boot( data = df, statistic = boot_knn_pred, R = 1000, formula = b ~ a, k = k, newdata = new_data ) # 提取CI信息存入结果 ci <- boot.ci(bs_obj, conf = 0.95, type = "bca") ci_results[[as.character(k)]] <- data.frame( k = k, point_estimate = mean(bs_obj$t), ci_lower = ci$bca[4], ci_upper = ci$bca[5] ) } # 合并为数据框直接查看对比所有结果 all_ci <- do.call(rbind, ci_results) print(all_ci, row.names = FALSE)
输出结果中point_estimate为对应k值的b估计值,ci_lower和ci_upper分别为95%置信区间的上下限,可直接对比不同k值的区间宽度和估计值差异。
内容的提问来源于stack exchange,提问作者241ringgit
相关产品推荐
相关产品推荐

