Jak wykreślić model liniowy R lm () za pomocą scatterplot3d za pomocą funkcji $ plane3d
Społeczność Stackoverflow,
Chcę wykreślić wyniki R lm()jako płaszczyzny na wykresie 3d wykonanym za pomocą scatterplot3d()polecenia z pakietu R scatterplot3d. Ciągle otrzymuję wiele błędów, w zależności od mojej metody tworzenia wykresu za pomocą $plane3d()funkcji.
Najpierw kilka odtwarzalnych danych - Krok 1: wykonanie ramki danych
elem <- data.frame(pH = c(8.12, 8.19, 6.09, 5.99, 5.18, 6.09, 5.40, 5.50, 4.93, 5.16, 7.57, 7.21, 5.13, 6.23, 5.72),
water_Loss = c(0.010, 0.005, 0.065, 0.120, 0.250, 0.305, 0.100, 0.020, 0.430, 0.060, 0.065, 0.050, 0.025, 0.050, 0.020),
elev = c(2397, 2393, 2593, 2599, 2741, 2774, 2979, 2787, 3173, 3370, 2147, 2130, 2374, 2359, 2643),
co2 = c(1.8410, 1.9810, 2.0110, 1.8960, 1.3060, 2.0160, 1.7360, 1.5860, 1.6360, 1.9665, 1.6360, 1.7660, 1.9760, 2.7510, 1.3310))
Krok 2 - dopasowanie modelu liniowego
lms <- lm(elem$co2 ~ elem$pH + elem$water_Loss + elem$elev + I(elem$pH * elem$water_Loss * elem$elev))
summary(lms)
Uwaga: nie ma LMS$model$xi lms$model$parametry y na wynikach tego modelu liniowego
Krok 3 - wykonanie wykresu 3D
library(scatterplot3d)
s3d <- scatterplot3d(elem[, -4], pch = 19, type = "p", grid = TRUE, box = FALSE, angle = 55)
Aby wykreślić wykres punktowy + lm()wynik, wykres s3d$plane3d()jest uruchamiany bezpośrednio po narysowaniu wykresu.
Lubię to:
s3d <- scatterplot3d(elem[, -4], pch = 19, type = "p", grid = TRUE, box = FALSE, angle = 55) s3d$plane3d()
Jednak idąc dalej, wskażę tylko s3d$plane3d()część.
Tutaj pojawia się problem. Podkreślę 3 różne sposoby, w jakie próbowałem wyświetlić model liniowy na tym wykresie
Próba 1: Bezpośrednie wykreślenie wyników lms
s3d$plane3d(lms, draw_polygon = TRUE, draw_lines = TRUE)
Co powoduje następujący błąd:
Błąd w xy.coords (x, y, setLab = FALSE): długości „x” i „y” różnią się
Szukając rozwiązania tego problemu, poszedłem tutaj: długości „x” i „y” różnią się BŁĘDEM podczas kreślenia
Jak sugerował post, użyłem flagi, lm(x = TRUE, y = TRUE)ale nadal nie miałem takich parametrów w lm()wynikach, aby móc sprawdzić length()i to nie zadziałało.
Próba 2: Określenie współrzędnych x, y, z z punktem przecięcia na wykresie rozrzutu
Postępowałem zgodnie z tą sugestią, aby to zrobić: R - Rozszerzanie modelu liniowego poza scatterplot3d
Dla flagi przechwycenia użyłem następującego kodu: lms$coefficientsi wziąłem wartość pod (Intercept).
s3d$plane3d(xyz.coords(x = as.numeric(lms$model$`elem$pH`), y = as.numeric(lms$model$`elem$water_Loss`), z = as.numeric(lms$model$`elem$elev`)), Intercept = 3.010033e+00 )
Co powoduje następujący błąd:
Błąd w x.coef * x.scal: nieliczbowy argument operatora binarnego
Próba 3: Wykreślenie indywidualnych współczynników i próba narysowania wielokątów i linii
Próbowałem tego w ten sposób po przeczytaniu dokumentacji w R dla planes3d()polecenia z {rgl}
Uzyskanie współczynników:
coefs <- coef(lms) ; coefs
s3d$plane3d(a = -5.901006e-02 , b = -1.546285e+01, c = -2.946729e-04, Intercept = 3.010033e+00)
Co powoduje następujący błąd:
Błąd w x.coef * x.scal: nieliczbowy argument operatora binarnego
Próbowałem też dodać flagi draw_polygon = TRUE, draw_lines = TRUEdo powyższego polecenia, co dało tylko kolejny błąd - dolna linia - nie działa.
W tym momencie jestem kompletnie zagubiony (próbowałem wielu innych metod - których nie mogę opublikować wszystkich). Chciałbym prosić o pomoc w sprecyzowaniu, czego dokładnie brakuje mi do narysowania tej płaszczyzny na tym wykresie. Każda pomoc zostanie bardzo doceniona.
Dziękuję Ci.
Odpowiedzi
scatterplot3d()nie będzie w stanie kreślić modeli o większej wymiarowości (niż 2 wymiary wejściowe i 1 wymiar wyjściowy) w 3D. W rzeczywistości taki wykres nie byłby prawidłowy, ponieważ wartości w dodatkowych wymiarach przypuszczalnie będą różne dla różnych obserwacji. Miałyby zatem wpływ na to, jak dokładnie model pasuje, a fabuła, która je zaniedbuje, byłaby myląca.
To powiedziawszy, s3d$plane3dnie radzi sobie zbyt dobrze ze zniekształconymi danymi wejściowymi. Na przykład, jeśli wymiarowość modelu nie jest zgodna z oczekiwaniami, zwróci on mylące komunikaty o błędach (jak widzieliście). Nie ma również pomocy dla tej funkcji i faktycznie funkcja jest zagnieżdżona w innej funkcji w pakiecie i nie ma komentarzy. W rezultacie wszystko to będzie dość trudne do zrozumienia, ale jeśli chcesz wejść głębiej, musisz przeczytać kod pakietu, który możesz znaleźć tutaj .
Absolutnie możesz mieć wykres pokazujący częściową powierzchnię regresji, ale musisz powiedzieć plot3d, które wymiary chcesz. Zasadniczo kreśliłbyś płaszczyznę w przestrzeni 3D, gdzie powinieneś mieć hiperpłaszczyznę w przestrzeni wyższego wymiaru.
Twoja próba 2 była na dobrej drodze. Ale nie przekazujesz właściwego argumentu. Funkcja chce x.coefi y.coefitp., Ale nie xyz.coordsi dlatego najwyraźniej próbuje zinterpretować wektory, które przekazujesz, jako współczynnik i zawodzi. Zamiast tego możesz to zrobić:
s3d$plane3d(Intercept=lms$coefficients["(Intercept)"][[1]], x.coef=lms$coefficients["elem$pH"][[1]], y.coef=lms$coefficients["elem$water_Loss"][[1]],
draw_polygon = TRUE,
draw_lines = TRUE,
polygon_args = list(col = rgb(0.8, 0.8, 0.8, 0.8)))
Jednak jest mało prawdopodobne, abyś zobaczył nawet powierzchnię regresji na swoim wykresie, ponieważ wpływ wymiarów, których nie wykreślasz, przesunie ją poza widoczny obszar twojej figury. Jeśli chcesz go cofnąć siłą, musisz zmodyfikować przechwycenie:
average_intercept <- lms$coefficients["(Intercept)"][[1]] + lms$coefficients["elem$elev"][[1]] * mean(elem$elev) s3d$plane3d(Intercept=average_intercept,
x.coef=lms$coefficients["elem$pH"][[1]],
y.coef=lms$coefficients["elem$water_Loss"][[1]],
draw_polygon = TRUE,
draw_lines = TRUE,
polygon_args = list(col = rgb(0.8, 0.8, 0.8, 0.8)))
Ale płaszczyzna, którą widzisz, jest w rzeczywistości tylko przekrojem 2d przez powierzchnię 3D, która jest twoją regresją i dokładnie przedstawia tylko obserwacje, które miały dokładnie średnią wartość w tym trzecim wymiarze ( elevw twoim przypadku).
W rzeczywistości jest to dokładnie to, co uzyskasz, jeśli przeprowadzisz regresję bez dodatkowych wymiarów; więc równie dobrze możesz to zrobić i zaplanować.