gpt4 book ai didi

来自数据框的 RGL 曲面图

转载 作者:行者123 更新时间:2023-12-01 12:36:29 26 4
gpt4 key购买 nike

我使用 scatter3d()Rcmdr 创建了一个漂亮的图。该图包含两个漂亮的表面平滑度。现在我想向该图添加另一个表面,真相(即由生成我的观察值的函数定义的表面减去噪声分量)。

到目前为止,这是我的代码:

library(car) 
set.seed(1)

n <- 200 # number of observations (x,y,z) to be generated
sd <- 0.3 # standard deviation for error term
x <- runif(n) # generate x component
y <- runif(n) # generate y component

r <- sqrt(x^2+y^2) # used to compute z values

z_t <- sin(x^2+3*y^2)/(0.1+r^2) + (x^2+5*y^2)*exp(1-r^2)/2 # calculate values of true regression function

z <- z_t + rnorm(n, sd = sd) # overlay normally distrbuted 'noise'
dm <- data.frame(x=x, y=y, z=z) # data frame containing (x,y,z) observations
dm_t <- data.frame(x=x,y=y, z=z_t) # data frame containing (x,y) observations and the corresponding value of the *true* regression function

# Create 3D scatterplot of:
# - Observations (this includes 'noise')
# - Surface given by Additive Model fit
# - Surface given by bivariate smoother fit

scatter3d(dm$x, dm$y, dm$z, fit=c("smooth","additive"), bg="white",
axis.scales=TRUE, grid=TRUE, ellipsoid=FALSE, xlab="x", ylab="z", zlab="y")

另一个线程中给出的解决方案是然后定义一个函数:

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, ...)
}

f <- function(x, y)
sin(x^2+3*y^2)/(0.1+r^2) + (x^2+5*y^2)*exp(1-r^2)/2

my_surface(f, alpha=0.2)

然而,这会产生一个错误,说(从德语翻译过来,因为这是我的系统语言,我道歉):

Error in outer(x, y, f) : 
Dimension [Product 100] does not match the length of the object [200]

然后我尝试了另一种方法:

x <- seq(0,1,length=20)
y <- x
z <- outer(x,y,f)
surface3d(x,y,z)

这确实为我的绘图添加了一个表面,但它看起来根本不正确(即观察结果甚至不接近它)。这是假定的真实表面的样子(这显然是错误的):谢谢!

The wrong "true" regression surface

我认为问题实际上可能在于扩展。在这里,我创建了几个位于平面 z = x+y 上的点。然后我继续尝试使用上面的方法绘制该平面:

library(car)

n <- 50
x <- runif(n)
y <- runif(n)
z <- x+y

scatter3d(x,y,z, surface = FALSE)

f <- function(x,y)
x + y

x_grid <- seq(0,1, length=20)
y_grid <- x_grid
z_grid <- outer(x_grid, y_grid, f)
surface3d(x_grid, y_grid, z_grid)

这给了我以下情节:

The scaling issue

也许你们中有人可以帮我解决这个问题?

最佳答案

car 中的 scatter3d 函数在绘制之前重新缩放数据,这使得它基本上与所有 rgl 绘图函数不兼容,包括 surface3d

您可以使用所有 rgl 函数获得您想要的图,例如plot3d(x, y, z) 代替 scatter3d,当然它会有 rgl 风格的轴而不是 car 风格的轴。

关于来自数据框的 RGL 曲面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18231846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com