在R中绘制3D表面

时间:2014-07-10 21:47:55

标签: r plot 3d

我有lm(log(z) ~ x*y)形式的lm。

我可以使用s3d <- scatterplot3d(x,y,log(z))制作数据的3D散点图。

如何绘制回归函数的表面?

我知道我可以为s3d$plane3d(lm(log(z) ~ x + y)做一个简单的线性模型,但这对非平面曲面不起作用;例如s3d$plane3d(lm(log(z) ~ x * y)无法工作。

1 个答案:

答案 0 :(得分:2)

首先,如果您提供样本数据集(或实际数据,哪个更好)以及代码的可重现示例,则您更有可能获得帮助。否则你强迫我们这样做 - 我认为这就是为什么你的问题被忽略了6个小时。有关详细信息,请参阅this link

其次,使用lm(...)这样的formula=log(z)~x*y是一个非常糟糕的主意。线性建模基于以下假设:响应中的错误(在您的情况下为log(z))通常以恒定方差分布。如果您的z-data具有常态差异的正态分布错误,那么log(z)肯定不会。这是一个经典的错误;正确的方法是使用广义线性建模(参见glm包等),family=poisson

最后,问你的问题。下面的代码创建了一个覆盖在响应曲面上的3D散点图。它使用rgl包,生成可旋转的3D图。

我在这里对点进行着色,使得表面下方的那些是红色的,而上面的那些是绿色的,并且从每个点到表面添加了下划线。

棘手的一点是,在surface3d(...)中,x和y参数是对应于网格的向量,z是一个矩阵,每个x值有一行,每个y值有一列。

对于您的真实数据,您可能需要调整scale=...中的open3d(...)参数。

# create sample dataset - you have this already,,,
set.seed(1)   # for reproducible example
df <- data.frame(x=sample(1:50,50)/50,y=sample(1:50,50)/50)
df$z <- with(df,exp(4*x + 2*y - 6*x*y + 6)+rnorm(50,sd=500))
fit <- lm(log(z) ~ x*y,df)   # bad, bad, bad - don't do this!!!

# you start here...
df$pred <- predict(fit)
# set up matrix of z-values
x <- seq(min(df$x),max(df$x),len=100)
y <- seq(min(df$y),max(df$y),len=100)
plot.df <- expand.grid(x=x,y=y)
plot.df$z <- predict(fit,newdata=plot.df)
library(reshape2)
z <- dcast(plot.df,x~y,value.var="z")[-1]

# plot the points, the fitted surface, and droplines
library(rgl)
colors <- 2.5+0.5*sign(residuals(fit))
open3d(scale=c(1,1,0.2))
points3d(df$x,df$y,log(df$z),col=colors)
surface3d(x,y,as.matrix(z),col="blue",alpha=.2)
apply(df,1,function(row)lines3d(rep(row[1],2),rep(row[2],2),c(log(row[3]),row[4]),col=colors))
axes3d()
title3d(xlab="X",ylab="Y",zlab="log(Z)")