我有一些点云数据(xyz坐标),需要拟合成线性模型。我打算使用lm()函数进行拟合。
这是我的尝试过程:
尽管红线看起来像是很合适的拟合,但我并不确定它是否真的合适。如果你旋转图表,它看起来并不是很好。
这是我的尝试过程:
library(scatterplot3d)
# example points
x <- c(1,4,3,6,2,5)
y <- c(2,2,4,3,5,9)
z <- c(1,3,5,9,2,2)
# plot
s <- scatterplot3d(x,y,z, type="b")
# fit the model
ff = lm(z ~ x + y) ## in ff$coefficients are the line paramters z, mx, ny
# create coordinates for a short line (the fit) to plot
llx = c(min(x), max(x))
lly = c(min(y), max(y))
llz = c(
ff$coefficients[[1]] + llx[1] * ff$coefficients[[2]] + lly[1] * ff$coefficients[[3]],
ff$coefficients[[1]] + llx[2] * ff$coefficients[[2]] + lly[2] * ff$coefficients[[3]]
)
## create 2d coordinates to place in scatterplot
p0 <- s$xyz.convert(llx[1],lly[1],llz[1])
p1 <- s$xyz.convert(llx[2],lly[2],llz[2])
# draw line
segments(p0$x,p0$y,p1$x,p1$y,lwd=2,col=2)
尽管红线看起来像是很合适的拟合,但我并不确定它是否真的合适。如果你旋转图表,它看起来并不是很好。
for(i in seq(from=30, to=60, by=1)){
s <- scatterplot3d(x,y,z, type="b", angle=i)
segments(p0$x,p0$y,p1$x,p1$y,lwd=2,col=2)
Sys.sleep(0.1)
}
这是否只是由于线的二维投影?您能否以某种方式更新坐标?我尝试给 $xyz.convert() 函数添加 "angle" 属性,但没有成功。
另外,当我只使用两个示例点时,拟合失败。
x <- c(1,4)
y <- c(2,5)
z <- c(1,3)
我希望确认我是否正确使用lm()函数。谢谢!
[编辑]
我了解到,lm()函数基于我提供的模型(z~x+y)将一个平面拟合到数据上。这不是我想要的。实际上,我完全误解了lm()函数。即使对于二维数据也是如此。例如,lm(y~x)试图最小化拟合与数据之间的垂直距离。但是,我希望将数据视为完全独立的(空间数据),并最小化拟合与数据之间的垂线距离(参见这里的第一段:http://mathpages.com/home/kmath110.htm)。
标记为正确答案的回答正是这样做的。这个原则被称为“主成分分析”。
llx
和lly
的有序对可能并不总是对应于输入。就像上面的有序对llx
和lly
是(1,2)
和(6,9)
。虽然你通过运气得到了(1,2)
对,但是(6,9)
对不是你的输入数据集的一部分。因此,你得到了不正确的回归线。解决方案是使用输入数据集中的点的有序对来绘制回归线。 - 9Headsx
和y
独立地进行并相应的z
所可能产生的所有三元组。然后它将覆盖整个“2D平面”。我所说的是,“x”和“y”是相关的(对应于相同的观察)。 - 9Heads