Załóżmy, że mam zmienną odpowiedzi i dane zawierające trzy zmienne towarzyszące (jako przykład zabawki):
y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
Chcę dopasować regresję liniową do danych:
fit = lm(y ~ d$x1 + d$x2 + d$y2)
Czy istnieje sposób na zapisanie wzoru, aby nie musieć zapisywać poszczególnych zmiennych towarzyszących? Na przykład coś takiego
fit = lm(y ~ d)
(Chcę, aby każda zmienna w ramce danych była współzmienną). Pytam, ponieważ mam w ramce danych 50 zmiennych, więc chcę uniknąć pisania x1 + x2 + x3 + etc
.
Odpowiedzi:
Istnieje specjalny identyfikator, którego można użyć we wzorze do oznaczenia wszystkich zmiennych, jest to
.
identyfikator.Możesz także zrobić takie rzeczy, aby użyć wszystkich zmiennych oprócz jednej (w tym przypadku x3 jest wykluczone):
Technicznie
.
oznacza wszystkie zmienne niewymienione we wzorze . Na przykładgdzie
.
odniesie się tylkox3
jakox1
ix2
już są w formule.źródło
.
technicznie oznacza , że wszystkie zmiennedata
nie znajdują się jeszcze w formule .data
to lista, z której wyszukuje się zmienne w formule z tej listy, to tak. Ramka danych, lista lub środowisko to dopuszczalne opcjedata
argumentu. Jeśli nie to masz na myśli, musisz trochę bardziej rozwinąć.lm(d[[1]] ~ d[[3]] + ., data = d)
names
z listy; trzeba powiedziećll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))
, to następujące prace:lm(y ~ x + ., data = ll)
. Nie ma więc powodu, aby mieć takie dane, chyba że jest to już lista, ale działa. Wymóg, aby elementy formuły były tej samej długości, nakłada pewne ograniczenia na zawartość listy. Bardziej złożone obiekty prawdopodobnie wymagają kodu do wyodrębnienia żądanych elementów; gdybyd[[1]]
była ramka / macierz danych, potrzebujesz kodu, aby to działałoNieco innym podejściem jest utworzenie formuły z ciągu znaków. Na stronie
formula
pomocy znajdziesz następujący przykład:Następnie, jeśli spojrzysz na wygenerowaną formułę, otrzymasz:
źródło
Tak, oczywiście, po prostu dodaj odpowiedź
y
jako pierwszą kolumnę w ramce danych i wywołajlm()
ją:Ponadto moje informacje o R wskazują, że przypisanie z
<-
jest zalecane powyżej=
.źródło
foo(bar <- 1:10)
działają (ibar
są tworzone), alefoo(bar = 1:10)
albo zawiodą, ponieważbar
nie są argumentemfoo
i też nie utworząbar
.x3
NA
?Rozszerzeniem metody Dżuby jest użycie
reformulate
, funkcja, która została wyraźnie zaprojektowana do takiego zadania.Na przykład w PO najłatwiejszym rozwiązaniem byłoby tutaj
lub
Zauważ, że dodanie zmiennej zależnej do data.frame w
d <- cbind(y, d)
jest preferowane nie tylko dlatego, że pozwala na użyciereformulate
, ale także dlatego, że pozwala na przyszłe użycielm
obiektu w funkcjach takich jakpredict
.źródło
Buduję to rozwiązanie,
reformulate
nie dbam o to, czy nazwy zmiennych mają spacje.`` ''
źródło
Możesz sprawdzić pakiet,
leaps
aw szczególności funkcjeregsubsets()
funkcji wyboru modelu. Jak podano w dokumentacji:Wybór modelu poprzez wyczerpujące wyszukiwanie, krokowe do przodu lub do tyłu lub sekwencyjną wymianę
źródło