2009-09-10 37 views
9

Tengo una bonita superficie que representa resultados de regresión multinivel no lineales en una regresión con dos variables independientes. Me gustaría trazar los valores pronosticados de regresión como una bonita superficie 3D y luego mostrar los valores reales como un punto que rebota en la superficie. Esta sería la versión 3D de trazar una línea de regresión y mostrar los valores reales como puntos alrededor de la línea. No puedo entender cómo hacer esto con celosía. Me complace utilizar otra biblioteca de gráficos en R, pero no sé de otros que hacen gráficos 3D.Trazar un wireframe Y una nube con celosía en R

Aquí hay una versión simplificada de lo que quiero hacer:

library(lattice) 
#set up some simplified data 
x <- seq(-.8, .8, .1) 
y <- seq(-.8, .8, .1) 
myGrid <- data.frame(expand.grid(x,y)) 
colnames(myGrid) <- c("x","y") 
myGrid$z <- myGrid$x + myGrid$y 
noise <- rnorm(length(myGrid$z),.3,.2) 
myGrid$z2 <- myGrid$x + myGrid$y + noise 

z es mi superficie lisa y Z2 son mis puntos ruidosos en su mayoría ligeramente por encima de la superficie. Por lo que la superficie se ve así:

wireframe(myGrid$z ~ myGrid$x * myGrid$y, xlab="X", ylab="Y", zlab="Z") 

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/09/wireframe.png

y la nube de puntos se parece a esto:

cloud(myGrid$z2 ~ myGrid$x * myGrid$y, xlab="X", ylab="Y", zlab="Z") 

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/09/cloud.png

¿Es posible conseguir ambas cosas en una panel de celosía?

Respuesta

0

Si la memoria le sirve, Rcmdr ya lo hace por usted usando rgl. Sin embargo, eso puede estar limitado a los modelos con los que Rcmdr se ajusta.

Por otro lado, le ofrece (¡rápido!) Desplazamiento, acercamiento, ... qué enrejado no puede hacer.

+0

I escatimado en mi tarjeta de gráficos de caja Linux porque "yo no juego" pero creo ¡RGL ciertamente se beneficiaría si hubiera decidido lo contrario! – hatmatrix

+0

También lo mantengo simple ("sin juegos") pero OpenGL a menudo funciona en hardware realmente simple. Dale una oportunidad, ya que recuerdo que solo necesitas 2d soporte. –

6

I do love rgl! Pero también hay momentos en los que los trazados tridimensionales en celosía son útiles: puede escribir su propia función, que puede pasar al argumento "panel" para enredar las funciones. Por ejemplo,

mypanel <- function(x,y,z,...) { 
    panel.wireframe(x,y,z,...) 
    panel.cloud(x,y,z,...) 
} 
wireframe(myGrid$z ~ myGrid$x * myGrid$y, xlab="X", ylab="Y", zlab="Z", 
      panel=mypanel) 

La última función que llama puede ser wireframe() o cloud(); en cualquier caso, ya que se llama a panel.wireframe() y panel.cloud() dentro de la función del panel, el resultado debería ser el mismo.

Edit: Gracias por señalarlo, Aaron, entonces probablemente usted puede pasar z2 como otra variable:

mypanel <- function(x,y,z,z2,...) { 
    panel.wireframe(x,y,z,...) 
    panel.cloud(x,y,z2,...) 
} 
wireframe(z ~ x * y, data=myGrid, xlab="X", ylab="Y", zlab="Z", 
      panel=mypanel, z2=myGrid$z2) 
+2

¡Agradable! Pero para usar los puntos de 'z2' en lugar de' z' para la nube, use 'panel.cloud (x, y, myGrid $ z2)' en la función 'mypanel'. – Aaron

+0

Ah, y cómo dibujar la nube, pero para diferentes x e y? – Rekin

+0

Probablemente pueda 1) rbind() otro conjunto de x, y, z's a myGrid, 2) agregar un valor categórico a myGrid, y 3) pasar esta variable categórica (factor) al argumento de grupos. – hatmatrix

Cuestiones relacionadas