2009-09-10 14 views
9

Mam ładną powierzchnię, która reprezentuje nieliniowe wieloczęściowe wyniki regresji na regresji z dwiema niezależnymi zmiennymi. Chciałbym wykreślić przewidywane wartości regresji jako ładną powierzchnię 3D, a następnie pokazać rzeczywiste wartości jako punkt, który odbija się od powierzchni. Byłaby to wersja 3D kreślenia linii regresji i pokazująca rzeczywistość jako punkty wokół linii. Nie mogę wymyślić, jak to zrobić z kratką. Cieszę się, że mogę użyć innej biblioteki graficznej w R, ale nie znam innych, którzy robią wykresy 3D.Wykreślanie krawędziówki ORAZ chmury z siatką w R

Oto uproszczona wersja tego, co chcę zrobić:

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 

oo to moja gładka powierzchnia i Z2 są moje głośne punkty przeważnie nieco powyżej powierzchni. Tak więc powierzchnia wygląda następująco:

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

i chmura punktów wygląda następująco:

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

Czy to możliwe, aby uzyskać zarówno z nich w jednym panel kratowy?

Odpowiedz

0

Jeśli pamięć działa, Rcmdr robi to za ciebie używając Rgl. To może być jednak ograniczone do modeli, które pasują do Rcmdr.

Z drugiej strony, daje (szybkie!) Przewijanie, powiększanie, ... której krata nie może zrobić.

+0

I skimped na mojej karcie graficznej Linuksem, ponieważ „nie grać”, ale myślę, RGL z pewnością skorzystałby, gdybym zdecydował inaczej! – hatmatrix

+0

Utrzymuję też prostotę ("bez gier"), ale OpenGL często działa na naprawdę prostym sprzęcie. Daj temu szansę - jak pamiętam, potrzebujesz tylko wsparcia 2d. –

6

Ja kocham rgl! Ale zdarzają się sytuacje, w których wykresy 3-D w sieci są również użyteczne - można napisać własną funkcję, którą można przekazać do argumentu "panel" do funkcji sieci. Na przykład,

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) 

Ostatnią funkcją wywołania może być szkielet() lub chmurę(); w obu przypadkach ponieważ panel.wireframe() i panel.cloud() są wywoływane w funkcji panelu, wynik powinien być taki sam.

Edit: Dzięki za wskazanie, że obecnie, Aaron, to prawdopodobnie można przekazać innej zmiennej z2 jak:

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

Nice! Ale aby użyć punktów z 'z2' zamiast' z' dla chmury, użyj 'panel.cloud (x, y, myGrid $ z2)' w funkcji 'mypanel'. – Aaron

+0

Aha, i jak narysować chmurę, ale dla różnych x i y? – Rekin

+0

Prawdopodobnie możesz 1) rbind() inny zestaw x, y, z do myGrid, 2) dodać kategoryczną wartość do myGrid i 3) przekazać tę kategoryczną zmienną (czynnik) do argumentu groups. – hatmatrix