2009-09-10 2 views
9

У меня хорошая поверхность, которая представляет результаты нелинейной многочастной регрессии при регрессии с двумя независимыми переменными. Я хотел бы построить предсказанные значения регрессии как приятную трехмерную поверхность, а затем показать фактические значения в качестве точки, отражающейся вокруг поверхности. Это будет трехмерная версия построения линии регрессии и отображение фактических значений в виде точек вокруг линии. Я не могу понять, как это сделать с решеткой. Я рад использовать другую графическую библиотеку в R, но я не знаю других, которые делают 3D-графики.Построение каркаса И облака с решеткой в ​​R

Вот упрощенная версия того, что я хочу сделать:

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 

г моя гладкая поверхность и z2 мои шумные точки в основном немного выше поверхности. Таким образом, поверхность выглядит следующим образом:

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

и облако точек выглядит следующим образом:

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

Можно ли получить оба из них в одном решетчатая панель?

ответ

0

Если память используется, Rcmdr уже делает это для вас, используя rgl. Это может быть ограничено моделями, которые подходят Rcmdr.

С другой стороны, это дает вам (быструю!) Прокрутку, масштабирование, ... которую решетка не может сделать.

+0

Я поскупились на моем Linux ящик видеокарты, потому что «я не играю в игры», но я думаю, RGL, конечно, выиграл бы, если бы я решил иначе! – hatmatrix

+0

Я также сохраняю это просто («нет игр»), но OpenGL часто работает на действительно простом оборудовании. Дайте ему шанс - как я помню, вам нужна только поддержка 2d. –

6

Я люблю rgl! Но бывают случаи, когда полезны трехмерные графики в решетке - вы можете написать свою собственную функцию, которую вы можете передать аргументу «panel» для функций решетки. Например,

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) 

Последняя функция, которую вы вызываете, может быть wireframe() или cloud(); в любом случае, поскольку panel.wireframe() и panel.cloud() вызываются внутри функции панели, результат должен быть одинаковым.

Edit: Спасибо за указание, что из, Аарон, то, возможно, вы можете передать z2 в другой переменной:

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

Ницца! Но для использования точек из 'z2' вместо' z' для облака используйте 'panel.cloud (x, y, myGrid $ z2)' в 'mypanel' функции. – Aaron

+0

О, и как рисовать облако, но для разных х и у? – Rekin

+0

Вы можете, вероятно, 1) rbind() другой набор из x, y, z в myGrid, 2) добавить категориальное значение в myGrid и 3) передать эту категориальную переменную (коэффициент) в аргумент groups. – hatmatrix

Смежные вопросы