You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:27:04