如何在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
相关产品推荐
相关产品推荐

