如何通过 $plane3d 函数使用 scatterplot3d 绘制 R 线性模型 lm()

How to plot R linear model lm() using scatterplot3d via $plane3d function

Whosebug 社区,

我希望将 R 的 lm() 结果绘制为 3d 图中的一个平面,该 3d 图形是使用 R 包 scatterplot3d 中的 scatterplot3d() 命令制作的。我不断收到多个错误,具体取决于我尝试通过 $plane3d() 函数绘制图表的方法。

首先,一些可重现的数据 - 第 1 步:制作数据框

elem <- data.frame(pH = c(8.12, 8.19, 6.09, 5.99, 5.18, 6.09, 5.40, 5.50, 4.93, 5.16, 7.57, 7.21, 5.13, 6.23, 5.72), 
              water_Loss = c(0.010, 0.005, 0.065, 0.120, 0.250, 0.305, 0.100, 0.020, 0.430, 0.060, 0.065, 0.050, 0.025, 0.050, 0.020), 
              elev = c(2397, 2393, 2593, 2599, 2741, 2774, 2979, 2787, 3173, 3370, 2147, 2130, 2374, 2359, 2643), 
              co2 = c(1.8410, 1.9810, 2.0110, 1.8960, 1.3060, 2.0160, 1.7360, 1.5860, 1.6360, 1.9665, 1.6360, 1.7660, 1.9760, 2.7510, 1.3310))

第 2 步 - 拟合线性模型

lms <- lm(elem$co2 ~ elem$pH + elem$water_Loss + elem$elev + I(elem$pH * elem$water_Loss * elem$elev))
summary(lms)

To note: there aren't lms$model$x and lms$model$y parameters on the results of this linear model

第 3 步 - 制作 3d 图

library(scatterplot3d)

s3d <- scatterplot3d(elem[, -4], pch = 19, type = "p", grid = TRUE, box = FALSE, angle = 55)

绘制散点图+lm()结果,s3d$plane3d()先画图后直接运行。

像这样:

s3d <- scatterplot3d(elem[, -4], pch = 19, type = "p", grid = TRUE, box = FALSE, angle = 55) s3d$plane3d()

但是,接下来,我只会指出 s3d$plane3d() 部分。

这就是问题所在。我将重点介绍我尝试让线性模型显示在此图上的 3 种不同方式

尝试1:直接绘制lms的结果

s3d$plane3d(lms, draw_polygon = TRUE, draw_lines = TRUE)

这会产生以下错误:

Error in xy.coords(x, y, setLab = FALSE) : 'x' and 'y' lengths differ

为了解决这个问题,我去了这里:

就像 post 建议的那样,我使用了标志 lm(x = TRUE, y = TRUE) 但是我在 lm() 结果中仍然没有这样的参数来检查 length() 和这没有用。

尝试 2:在散点图中用截距指定 x、y、z 坐标

我是按照这个建议这样做的:R - Extending Linear Model beyond scatterplot3d

对于拦截标志,我使用了以下代码:lms$coefficients并取了(拦截)下的值。

s3d$plane3d(xyz.coords(x = as.numeric(lms$model$`elem$pH`), y = as.numeric(lms$model$`elem$water_Loss`), z = as.numeric(lms$model$`elem$elev`)), Intercept = 3.010033e+00  )

这会产生以下错误:

Error in x.coef * x.scal : non-numeric argument to binary operator

尝试 3:绘制单个系数并尝试绘制多边形和线条

我在阅读 R 中关于来自 {rgl}

planes3d() 命令的文档后尝试了这种方法

获取系数:

coefs <- coef(lms) ; coefs
s3d$plane3d(a = -5.901006e-02 , b = -1.546285e+01, c = -2.946729e-04, Intercept = 3.010033e+00)

这会产生以下错误:

Error in x.coef * x.scal : non-numeric argument to binary operator

我还尝试将标志 draw_polygon = TRUE, draw_lines = TRUE 添加到上面的命令,这只给出了另一个错误 - 底线 - 没有用。

在这一点上,我完全不知所措(我尝试了很多其他方法 - 我无法 post 全部)。我想寻求帮助,试图查明我在这张图上绘制这架飞机到底缺少什么。非常感谢任何帮助。

谢谢。

scatterplot3d() 将无法在 3D 中绘制具有更大维度(大于 2 个输入维度和 1 个输出维度)的模型。事实上,这样的图是无效的,因为对于不同的观察,附加维度中的值可能会有所不同。因此,它们会影响模型的拟合程度,而忽略这些的图会产生误导。

也就是说,s3d$plane3d 不能很好地处理格式错误的输入。例如,如果模型的维数不符合预期,它将 return 令人困惑的错误消息(如您​​所见)。这个函数也没有任何帮助,实际上该函数嵌套在包中的另一个函数中并且没有注释。因此,这一切都将相当难以理解,但如果你想更深入,你必须阅读包的代码,你可以找到 here.

您绝对可以让您的绘图显示部分回归曲面,但您必须告诉 plot3d,您想要哪个维度。本质上你会在 3d space 中绘制一个平面,你应该在更高维度 space.

中有一个超平面

您的尝试 2 是在正确的轨道上。但是你没有交出正确的论据。该函数需要 x.coefy.coef 等,但不需要 xyz.coords,因此它显然试图将您移交的向量解释为系数,但失败了。您可以这样做:

s3d$plane3d(Intercept=lms$coefficients["(Intercept)"][[1]],
            x.coef=lms$coefficients["elem$pH"][[1]],
            y.coef=lms$coefficients["elem$water_Loss"][[1]],
            draw_polygon = TRUE, 
            draw_lines = TRUE, 
            polygon_args = list(col = rgb(0.8, 0.8, 0.8, 0.8)))

但是,您甚至不太可能在绘图中看到回归曲面,因为您未绘制的维度的影响会将其移出图形的可见区域。如果你想强行拉回来,你得修改你的拦截:

average_intercept <- lms$coefficients["(Intercept)"][[1]] + lms$coefficients["elem$elev"][[1]] * mean(elem$elev)
s3d$plane3d(Intercept=average_intercept,
            x.coef=lms$coefficients["elem$pH"][[1]],
            y.coef=lms$coefficients["elem$water_Loss"][[1]],
            draw_polygon = TRUE, 
            draw_lines = TRUE, 
            polygon_args = list(col = rgb(0.8, 0.8, 0.8, 0.8)))

但是你看到的平面实际上只是通过 3d 表面的 2d 切片,这是你的回归,准确地只代表你恰好在第三维中恰好具有平均值的观察结果(elev 在你的情况下)。

事实上,如果 运行 没有附加维度的回归,这正是您会得到的结果;所以你也可以这样做并绘制它。