2014-07-10 126 views
0

我有一個lm的形式lm(log(z) ~ x*y)在R中繪製3D表面

我可以使用s3d <- scatterplot3d(x,y,log(z))製作數據的3D散點圖。

如何繪製迴歸函數的曲面?

我知道我可以做一個簡單的線性模型s3d$plane3d(lm(log(z) ~ x + y),但是這對於非平面表面不起作用;例如s3d$plane3d(lm(log(z) ~ x * y)將不起作用。

+0

有'的'rgl'包()來看看'surface3d。 – jlhoward

+1

'scatterplot3d'的幫助頁面建議您查看'persp'。 –

回答

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值有一列。

對於您的真實數據,您可能需要調整open3d(...)中的scale=...參數。

# 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)") 

+0

感謝您的詳盡解答。我正在嘗試使用glms的建議,但我遇到了問題。而lm(log(z)〜x * y)工作正常,glm(z〜x * y,family = poisson)給我提供了錯誤: 「在dpois(y,mu,log = TRUE)中:非整數x = 0.000005」。有什麼想法嗎? – rhombidodecahedron

+0

你可以上傳你的數據(Dropbox?)並在你的問題中發佈一個鏈接到它嗎? – jlhoward