3

scatter3d()と を使用して素敵なプロットを作成しましたRcmdr。このプロットには、2 つの優れた表面平滑化が含まれています。ここで、このプロットにもう 1 つの表面、つまり真実を追加したいと思います(つまり、観測結果を生成する関数からノイズ成分を引いたものによって定義される表面)。

これまでの私のコードは次のとおりです。

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)

これは私のプロットに表面を追加しますが、まったく正しく見えません (つまり、観測はそれに近くありません)。想定される真のサーフェスは次のようになります (これは明らかに間違っています): ありがとう!

間違い

問題は実際にはスケーリングである可能性があると思います。ここでは、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)

これにより、次のプロットが得られます。

スケーリングの問題

多分あなたの一人がこれで私を助けることができますか?

4

1 に答える 1

0

The scatter3d function in car rescales data before plotting it, which makes it incompatible with essentially all rgl plotting functions, including surface3d.

You can get a plot something like what you want by using all rgl functions, e.g. plot3d(x, y, z) in place of scatter3d, but of course it will have rgl-style axes rather than car-style axes.

于 2016-06-25T11:05:53.803 に答える