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

问题描述

Stackoverflow社区,

我想用R包scatterplot3d中的lm()命令将R的scatterplot3d()的结果绘制为3d图中的平面。根据尝试通过$plane3d()函数进行图形绘制的方法,我不断收到多个错误

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

elem <- data.frame(pH = c(8.12,8.19,6.09,5.99,5.18,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.050,0.025,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.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)

请注意:此线性模型的结果中没有lms $ model $ x和lms $ model $ y参数

第3步-制作3d图形

library(scatterplot3d)

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

要绘制散点图+ lm()的结果,请先绘制s3d$plane3d()后再运行s3d <- scatterplot3d(elem[,angle = 55)

赞:

s3d$plane3d() s3d$plane3d()

但是,向前走,我只会指出s3d$plane3d(lms,draw_polygon = TRUE,draw_lines = TRUE) 部分。

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

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

lm(x = TRUE,y = TRUE)

哪个会产生以下错误

xy.coords(x,y,setLab = FALSE)错误:'x'和'y'的长度不同

解决此问题,我去了这里:'x' and 'y' lengths differ ERROR when plotting

就像帖子中建议的那样,我使用了标记lm(),但是在length()结果中我仍然没有这样的参数,因此无法检查lms$coefficients,这是行不通的。 / p>

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

我正在遵循以下建议:R - Extending Linear Model beyond scatterplot3d

对于拦截标志,我使用以下代码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 ) ,并在(Intercept)下获得了值。

planes3d()

哪个会产生以下错误

x.coef * x.scal中的错误:二进制运算符的非数字参数

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

从{rgl}中阅读coefs <- coef(lms) ; coefs s3d$plane3d(a = -5.901006e-02,b = -1.546285e+01,c = -2.946729e-04,Intercept = 3.010033e+00) 命令的R文档之后,我尝试过这种方式

获取系数:

draw_polygon = TRUE,draw_lines = TRUE

哪个会产生以下错误

x.coef * x.scal中的错误:二进制运算符的非数字参数

我还尝试将标志.onPost("/user/changepassword"),{ // How can I pass the values of the inputs }) .reply(() => { // How can I check the value of the inputs: empty,password input does not match... if (conditions are ok) { return [200,MOCK_RESPONSE.SUCCESS]; } else { return [200,MOCK_RESPONSE.ERROR]; } }); 添加到上述命令中,这仅产生了另一个错误-底线-不起作用。

在这一点上,我完全不知所措(我尝试了许多其他方法-无法将它们全部发布)。我想寻求帮助,以查明在此图上绘制此平面时我到底缺少了什么。任何帮助都将不胜感激。

谢谢。

解决方法

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

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

您绝对可以让绘图显示局部回归曲面,但是您必须告诉plot3d您想要哪个尺寸。本质上,您将在3d空间中绘制一个平面,而在高维空间中应该有一个超平面。

您的尝试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)))

但是,即使您不太可能在图中看到回归曲面,因为未绘制尺寸的影响会将其移出图形的可见区域。如果要用力将其拉回,则必须修改拦截器:

average_intercept <- lms$coefficients["(Intercept)"][[1]] + lms$coefficients["elem$elev"][[1]] * mean(elem$elev)
s3d$plane3d(Intercept=average_intercept,0.8)))

但是您看到的平面实际上只是穿过3d曲面的2d切片,这是您的回归分析,并且只能准确表示您恰好在该第三维维度上具有平均值(elev您的情况)。

实际上,这就是如果您在没有附加维度的情况下进行回归所得到的结果;因此您最好将其绘制出来。