绘制3D平面(真实回归曲面)

5

我正在尝试模拟一些数据(x1和x2是我的解释变量),使用指定的函数加上随机噪声计算y并绘制出观测结果和真实的回归面。目前为止,这是我所拥有的:

   set.seed(1)
   library(rgl)

   # Simulate some data 

   x1 <- runif(50)
   x2 <- runif(50)
   y <- sin(x1)*x2+x1*x2 + rnorm(50, sd=0.3)
   # 3D scatterplot of observations 
   plot3d(x1,x2,y, type="p", col="red", xlab="X1", ylab="X2", zlab="Y", site=5, lwd=15)

现在我不确定如何添加“真正的”回归平面。 我基本上正在寻找像curve()这样的东西,可以插入我的(真实的)模型公式。

谢谢!


我认为这个SO线程可能会对你有所帮助。 - geotheory
也许这个链接对你也有帮助。这里 - Christoph
3个回答

19

如果你想要一个平面,你可以使用 planes3d

由于你的模型不是线性的,它不是一个平面:你可以使用surface3d代替。

my_surface <- function(f, n=10, ...) { 
  ranges <- rgl:::.getRanges()
  x <- seq(ranges$xlim[1], ranges$xlim[2], length=n)
  y <- seq(ranges$ylim[1], ranges$ylim[2], length=n)
  z <- outer(x,y,f)
  surface3d(x, y, z, ...)
}
library(rgl)
f <- function(x1, x2)
  sin(x1) * x2 + x1 * x2
n <- 200
x1 <- 4*runif(n)
x2 <- 4*runif(n)
y <- f(x1, x2) + rnorm(n, sd=0.3)
plot3d(x1,x2,y, type="p", col="red", xlab="X1", ylab="X2", zlab="Y", site=5, lwd=15)
my_surface(f, alpha=.2 )

rgl.snapshot


可以,谢谢!我能否选择一个点(观测值)并在其周围绘制一个球体(使用指定的半径)?最好是一个周围有许多观测值的点(这些观测值最终会在球体内)。 - user2249626
一旦你知道想要一个球体的位置,你可以使用spheres3d函数,例如:i <- 1; spheres3d(x1[i], x2[i], y[i], radius=1, alpha=.5) - Vincent Zoonekynd
@VincentZoonekynd +1!你知道persp3dsurface3d之间的区别吗?看起来后者默认情况下有add=TRUE - agstudy
surface3d旨在添加到现有的绘图中,而persp3d旨在作为初始绘图命令。 - IRTFM

1
抱歉:(我没有认真阅读问题,现在看到您想要绘制“真相”时,我匆忙进行了估计。)
以下是使用loess进行估计并进行表面绘图的方法:
mod2 <- loess(y~x1+x2)
grd<- data.frame(x1=seq(range(x1)[1],range(x1)[2],len=20), 
                 x2=seq(range(x2)[1],range(x2)[2],len=20))
grd$pred <- predict(mod2, newdata=grd)
grd <- grd[order(grd$x1,grd$x2),]
x1 <- unique(grd$x1)
x2 <- unique(grd$x2)   # shouldn't have used y
surface3d(x1, x2, z=matrix(grd$pred,length(x1),length(x2)) )

Points and loess fit


谢谢您的回复,尽管如此,这对我很有帮助。你能告诉我为什么你排序了网格,并且为什么使用了“unique”吗?干杯! - user2249626

1

IRTFM的回答有些不完美,让我找到了CRAN帮助页面上的一个线程。
https://stat.ethz.ch/pipermail/r-help/2013-December/364037.html
我提取了相关代码并将其转换为函数,如下所示:

require(rgl)
pred.surf.3d <- function(df, x.nm,y.nm,z.nm, ...){
  x <- df[,x.nm]; y <- df[,y.nm]; z<-df[,z.nm]
  fit <- lm(z ~ x + y + x*y + x^2 + y^2)
  xnew <- seq(range(x)[1],range(x)[2],len=20)
  ynew <- seq(range(y)[1],range(y)[2],len=20)
  df <- expand.grid(x=xnew, y=ynew)
  df$z <- predict(fit, newdata=df)
  with(df, surface3d(xnew, ynew, z=df$z))
}

我可能最终会将其捆绑到我的CRAN实用程序包中。
同时,我希望您会发现它很有用!(在IRTFM的第一个代码块上运行如下:)
pred.surf.3d(data.frame(x1,x2,y),'x1','x2','y')

theoretical polynomial 2D fit alternative


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接