R语言拟合二次及高阶分位数回归模型与最优tau值选择方法
R语言连续变量高阶分位数回归实现与拟合效果评估
高阶非线性项的模型设置
你提到的den ~ salinity + salinity^2写法是错误的:R公式语法中^默认表示交互项层级,不会直接计算变量的幂次,高阶项的正确设置方式有两种:
- 方法1:用
I()函数包裹幂运算,强制解析为算术表达式,二次模型写法为den ~ salinity + I(salinity^2),需要更高阶项时直接追加对应幂次即可,例如三次项加I(salinity^3) - 方法2:用正交多项式函数
poly(),二次模型写法为den ~ poly(salinity, 2),这种方式可以自动规避多重共线性问题,更推荐高阶拟合场景使用
完整示例代码
# 加载分位数回归依赖包 library(quantreg) # 你的示例数据集 df <- structure(list(den = c(0, 12, 8.33, 5, 0, 0, 1, 1.33, 0, 3), salinity = c(37, 35, 36, 39, 36, 37, 35, 38, 36, 37)), row.names = c(86L, 240L, 394L, 548L, 702L, 856L, 1010L, 1164L, 1318L, 1472L), class = "data.frame") # 拟合0.75分位的二次分位数回归 # 写法1:手动指定平方项 quantreg75_quad1 <- rq(den ~ salinity + I(salinity^2), data = df, tau = 0.75) # 写法2:正交多项式 quantreg75_quad2 <- rq(den ~ poly(salinity, 2), data = df, tau = 0.75) # 查看模型回归系数与显著性 summary(quantreg75_quad1)
注意:你示例代码中data=rain需要替换为实际数据集名称,这里示例用df
不同tau水平的拟合效果判断
常用的评估方法有以下4种:
- 分位数损失值(目标函数值)
分位数回归的优化目标是最小化加权绝对损失,同一数据集下损失值越小,对应tau的拟合效果越好,可以直接用loss.rq()提取:
- 分位数损失值(目标函数值)
# 提取单模型损失 loss_75 <- loss.rq(quantreg75_quad1) # 同时拟合多个tau模型并对比损失 quantreg_multi <- rq(den ~ poly(salinity, 2), data = df, tau = c(0.25, 0.5, 0.75)) sapply(quantreg_multi, loss.rq)
- 分位数拟合优度R1
和线性回归的R2逻辑类似,R1取值范围为0-1,越接近1说明模型对对应分位的解释能力越强,可以从summary.rq()的返回结果中直接获取。
- 分位数拟合优度R1
- 残差分布校验
分位数回归的残差满足:对应tau下,正残差占比约为1-tau,负残差占比约为tau。例如0.75分位的模型,正残差占比应该接近25%,偏离越小说明拟合越符合分位数假设。
- 残差分布校验
- 交叉验证预测误差
将数据集拆分为训练集和测试集,在训练集拟合不同tau的模型,在测试集计算对应tau的加权绝对预测误差,误差越小说明模型的泛化能力越好,是更严谨的工业级评估方法。
- 交叉验证预测误差
如果你需要对比线性模型和二次模型的拟合效果,也可以用上述方法,同一tau下损失更小、R1更高的模型更优。
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

