如何在R中实现正确的多元三阶多项式回归?
问题原因
在R的公式语法中,^不是数学意义上的幂运算符,而是用来指定交互项的最高阶数。比如:
x^3仅表示包含x的所有项直到3阶交互,但单个变量的情况下等价于x;x*y等价于x + y + x:y(线性项+二阶交互)。
这就是你代码中只得到线性项和交互项,没有高阶幂次项的原因。
解决方法
有三种常用方式实现三阶多元多项式回归:
1. 使用I()包裹算术表达式
I()函数会将内部的表达式当作普通数学运算处理,而非公式语法:
# 避免覆盖内置lm函数,改用lm_model作为变量名 lm_model <- lm(activation_timing_ms ~ I(x^3) + I(y^3) + I(z^3) + I(x^2*y) + I(x^2*z) + I(y^2*x) + I(y^2*z) + I(z^2*x) + I(z^2*y) + I(x*y*z) + I(x^2) + I(y^2) + I(z^2) + I(x*y) + I(x*z) + I(y*z) + x + y + z, data = dat) # 查看所有系数 coef(lm_model)
2. 手动创建高阶变量
先在数据框中提前计算所有需要的高阶项,再代入公式:
# 添加高阶项到数据集 dat <- dat %>% mutate( x2 = x^2, x3 = x^3, y2 = y^2, y3 = y^3, z2 = z^2, z3 = z^3, x2y = x^2*y, x2z = x^2*z, y2x = y^2*x, y2z = y^2*z, z2x = z^2*x, z2y = z^2*y, xyz = x*y*z ) # 拟合模型 lm_model <- lm(activation_timing_ms ~ x3 + y3 + z3 + x2y + x2z + y2x + y2z + z2x + z2y + xyz + x2 + y2 + z2 + x*y + x*z + y*z + x + y + z, data = dat)
3. 使用poly()函数自动生成多项式项
poly()可以一键生成指定阶数的所有多项式项(包括交叉项),raw=TRUE表示使用原始多项式而非正交多项式:
lm_model <- lm(activation_timing_ms ~ poly(x, y, z, degree=3, raw=TRUE), data = dat) # 查看系数 coef(lm_model)
这种方式最简洁,无需手动列举所有项。
内容的提问来源于stack exchange,提问作者myfatson
相关产品推荐
相关产品推荐

