如何在R中将平面回归转换为曲面回归?
如何将二元平面回归改为曲面回归
你说得完全对,lm(z ~ x + y)构建的是二元线性回归模型,只能拟合出平面。要得到符合散点图趋势的曲面,我们需要给模型引入非线性项,比如变量的二次项、交互项,这样就能构建出二次曲面回归模型了。下面是具体的修改思路和代码示例:
核心修改思路
- 扩展回归模型公式:在原线性模型基础上,添加
x和y的二次项(x²、y²)以及两者的交互项(x*y),让模型具备拟合曲面的能力。 - 两种常见的模型写法:
- 直接用
I()包裹二次项(I(x^2)),明确表示原始平方项,适合直观理解; - 用
poly()函数生成多项式项,更简洁,还能选择正交多项式(默认)或原始多项式(raw=TRUE)。
- 直接用
修改后的完整代码
library(scatterplot3d) library(plot3D) library(readxl) RoomA <- read_excel("Data_without_outlier_RoomA.xlsx") # x, y, z variables x <- RoomA$Ammonia y <- RoomA$Ventilation z <- RoomA$Emissions # 方法1:直接添加二次项和交互项(直观写法) fit <- lm(z ~ x + y + I(x^2) + I(y^2) + x:y) # 方法2:用poly函数生成二次多项式(更简洁,raw=TRUE表示用原始多项式) # fit <- lm(z ~ poly(x, 2, raw=TRUE) + poly(y, 2, raw=TRUE) + x:y) # predict values on regular xy grid(这部分基本不用改) grid.lines = 25 x.pred <- seq(min(x), max(x), length.out = grid.lines) y.pred <- seq(min(y), max(y), length.out = grid.lines) xy <- expand.grid( x = x.pred, y = y.pred) z.pred <- matrix(predict(fit, newdata = xy), nrow = grid.lines, ncol = grid.lines) # fitted points for droplines to surface fitpoints <- predict(fit) # scatter plot with regression surface(surf参数直接用新的z.pred即可) scatter3D(x, y, z, pch = 20, cex = 1.5, theta = 320, phi = 25, ticktype = "detailed", xlab = "", ylab = "", zlab = "", surf = list(x = x.pred, y = y.pred, z = z.pred, facets = NA), main = "Room A - Quadratic Surface Regression")
额外说明
- 如果你尝试后觉得二次曲面还不够贴合数据,可以尝试更高次的多项式(比如三次项),但要注意过拟合问题,建议用R²、调整R²或者交叉验证来评估模型效果。
- 除了多项式回归,你也可以尝试其他非线性模型(比如样条回归),不过多项式回归是最容易上手的曲面拟合方式。
内容的提问来源于stack exchange,提问作者gwang gon Jo
相关产品推荐
相关产品推荐

