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

如何在R中将平面回归转换为曲面回归?

如何将二元平面回归改为曲面回归

你说得完全对,lm(z ~ x + y)构建的是二元线性回归模型,只能拟合出平面。要得到符合散点图趋势的曲面,我们需要给模型引入非线性项,比如变量的二次项、交互项,这样就能构建出二次曲面回归模型了。下面是具体的修改思路和代码示例:

核心修改思路

  • 扩展回归模型公式:在原线性模型基础上,添加x和y的二次项(x²、y²)以及两者的交互项(x*y),让模型具备拟合曲面的能力。
  • 两种常见的模型写法:
    1. 直接用I()包裹二次项(I(x^2)),明确表示原始平方项,适合直观理解;
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:17:42