簡體   English   中英

在R中繪制3D曲面

[英]Plotting a 3D surface in R

我有一個形式為lm(log(z) ~ x*y)

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

如何繪制回歸函數的表面?

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

因此,首先,如果您提供示例數據集(或實際數據,可能會更好)和可復制的代碼示例,則更有可能獲得幫助。 否則,您會強迫我們這樣做-我認為這就是為什么您的問題在6個小時內被忽略的原因。 有關更多詳細信息,請參見此鏈接

其次,像這樣使用lm(...) ,並使用formula=log(z)~x*y是一個非常糟糕的主意。 線性建模基於以下假設:響應中的誤差log(z)在您的情況下為log(z) )通常以恆定方差分布。 如果您的z-data具有具有恆定方差的正態分布誤差,則log(z)當然不會。 這是一個經典的錯誤; 正確的方法是使用帶有family=poisson廣義線性建模(請參閱glm軟件包以及其他內容)。

最后,對你的問題。 下面的代碼創建了一個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)")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM