问题描述
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.coef
和y.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
您的情况)。
实际上,这就是如果您在没有附加维度的情况下进行回归所得到的结果;因此您最好将其绘制出来。