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

如何在R中手动实现loess函数自助法并估计置信区间

LOESS平滑度调整与自助法置信区间手动实现

一、LOESS平滑度的其他控制方式

除了span参数(控制邻域样本占比,值越小拟合越粗糙,越大越平滑),还可以通过以下参数调整平滑效果:

  • degree:控制拟合的多项式次数,默认是2(二次多项式)。设为1时是线性LOESS,拟合结果更贴近直线,平滑程度更高;保持2则能捕捉更复杂的非线性趋势。
  • family:默认是"gaussian",若设为"symmetric",会使用对称权重降低异常值的影响,让拟合曲线更稳健,间接改变平滑后的形态。
  • control参数:通过loess.control()配置,比如:
    • iterations:设置稳健拟合的迭代次数(默认4次),减少次数会让拟合结果更粗糙,增加次数会让曲线更平滑但计算耗时更长。
    • surface:可选"direct"或"interpolate",不同的拟合算法会影响最终的平滑效果,"direct"适合大数据集,结果可能略有差异。

二、手动实现LOESS自助法置信区间

以下是基于R语言的手动实现步骤,完全匹配你的需求:在x范围[27.05575, 144.75700]的300个点上计算预测均值、标准差和置信区间。

假设你的原始数据是包含x和y列的数据框df,代码如下:

# 1. 生成300个均匀分布的预测点
x_pred <- seq(27.05575, 144.75700, length.out = 300)

# 2. 设置自助抽样参数(次数越多结果越精准,计算越慢)
n_boot <- 1000
# 初始化矩阵存储每次自助抽样的预测结果
boot_preds <- matrix(nrow = n_boot, ncol = length(x_pred))

# 3. 执行自助抽样循环
set.seed(123) # 固定随机种子,保证结果可重复
for(i in 1:n_boot) {
  # 从原始数据中有放回抽取相同数量的样本(自助法核心)
  boot_sample <- df[sample(nrow(df), replace = TRUE), ]
  # 拟合LOESS模型(可自行调整平滑参数,比如span、degree)
  loess_mod <- loess(y ~ x, data = boot_sample, span = 0.7, degree = 2)
  # 对预测点做预测,保存到矩阵中
  boot_preds[i, ] <- predict(loess_mod, newdata = data.frame(x = x_pred))
}

# 4. 计算每个预测点的统计量
mean_pred <- colMeans(boot_preds)       # 自助预测均值
sd_pred <- apply(boot_preds, 2, sd)     # 预测值的标准差
ci_lower <- apply(boot_preds, 2, quantile, probs = 0.025) # 95%置信区间下限
ci_upper <- apply(boot_preds, 2, quantile, probs = 0.975) # 95%置信区间上限

# 整理结果为数据框,方便后续分析或绘图
results <- data.frame(
  x = x_pred,
  predicted_mean = mean_pred,
  standard_deviation = sd_pred,
  ci_95_lower = ci_lower,
  ci_95_upper = ci_upper
)

关键原理说明

  • 自助法的核心是有放回抽样:每次从原始数据中抽取和原数据量相同的样本,模拟数据的抽样分布。
  • 多次拟合LOESS模型并预测后,每个预测点的多次预测值构成一个分布,通过这个分布计算均值(代表整体预测趋势)、标准差(预测的波动程度),以及分位数(置信区间)。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:57:41