Jak napisać formułę modelu liniowego ze 100 zmiennymi w języku R

22

Czy istnieje prosty sposób w R na utworzenie regresji liniowej na modelu ze 100 parametrami w R? Powiedzmy, że mamy wektor Y z 10 wartościami i ramkę danych X z 10 kolumnami i 100 wierszami W notacji matematycznej zapisałbym Y = X[[1]] + X[[2]] + ... + X[[100]]. Jak napisać coś podobnego w składni R.

chrześcijanin
źródło
1
czy jest ich 100 czy 1000? Zazwyczaj kolumny byłyby zmiennymi, a wiersze obserwacjami (wygląda na to, że jest odwrócony)
Makro
100 dodatkowe 0 to literówka
Christian
2
Naprawdę? Czy na pewno chcesz to zrobić? Byłbym zaniepokojony nadmiernym dopasowaniem i korelacją między liniowymi kombinacjami predyktorów. Co więcej, przy 100 predyktorach, ale tylko 10 obserwacjach, masz a regresja liniowa w ogóle nie zadziała. p>n
Aaron - Przywróć Monikę

Odpowiedzi:

29

Spróbuj tego

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)
danas.zuokas
źródło
4
A jeśli chcesz, powiedzmy, wszystkie interakcje drugiego rzędu, możesz pisać y ~ . + .^2. I tak dalej.
Lutz Prechelt
3
A jeśli chcesz tylko niektóre interakcje drugiego rzędu, coś takiego y ~ . + .:x1da ci interakcje każdej zmiennej (oprócz x1) z x1. I tak dalej; Masz pomysł.
Lutz Prechelt,
21

Świetne odpowiedzi!

Dodałbym, że domyślnie wywołanie formulaa data.frametworzy formułę addytywną, aby regresować pierwszą kolumnę do pozostałych.

Więc w przypadku odpowiedzi @ danas.zuokas możesz to zrobić

lm(df)

który jest poprawnie interpretowany.

gui11aume
źródło
Jednak ta odpowiedź nie działa, jeśli chcesz mieszać pod względem interakcji. Twój robi (+1).
gui11aume
6
Ciągle jestem zdumiony, jak przeciążona jest większość Roperatorów :)
Macro
19

Jeśli każdy wiersz jest obserwacją, a każda kolumna jest predyktorem, więc jest wektorem o długości a jest macierzą ( w tym przypadku ), możesz to zrobić za pomocąn X n × p p = 100YnXn×pp=100

Z = as.data.frame(cbind(Y,X))
lm(Y ~ .,data=Z)

Jeśli istnieją inne kolumny, których nie chcesz uwzględniać jako predyktorów, musisz je usunąć Xprzed użyciem tej sztuczki lub użyć -w formule modelu, aby je wykluczyć. Na przykład, jeśli chcesz wykluczyć 67. predyktor (który ma odpowiednią nazwę x67), możesz napisać

lm(Y ~ .-x67,data=Z)

Ponadto, jeśli chcesz uwzględnić interakcje itp., Musisz dodać je ręcznie jako (na przykład)

lm(Y ~ .+X[,1]*X[,2],data=Z)

lub upewnij się, że są wpisane jako kolumny X.

Makro
źródło
19

Możesz także użyć kombinacji funkcji formulai paste.

Skonfiguruj dane : wyobraźmy sobie, że mamy ramkę data.frame, która zawiera zmienne predykcyjne x1do x100i naszą zmienną zależną y, ale istnieje także zmienna uciążliwa asdfasdf. Również zmienne predykcyjne są ułożone w takiej kolejności, że nie wszystkie są ciągłe w ramce data.frame.

Data <- data.frame(matrix(rnorm(102 * 200), ncol=102))
names(Data) <- c(paste("x", 1:50, sep=""), 
    "asdfasdf", "y", paste("x", 51:100, sep=""))

Wyobraź sobie również, że masz ciąg znaków zawierający nazwy zmiennych predykcyjnych. W takim przypadku można to łatwo utworzyć za pomocą pastefunkcji, ale w innych sytuacjach greplub w celu uzyskania tego ciągu można zastosować inne podejście.

PredictorVariables <- paste("x", 1:100, sep="")

Zastosuj podejście : Możemy następnie zbudować formułę w następujący sposób:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • te collapsewkładki argumentów +pomiędzy predyktorami
  • formulakonwertuje ciąg znaków na obiekt o wzorze klasowym odpowiednim dla lmfunkcji.

Mówiąc bardziej ogólnie, używam następującej funkcji dość regularnie, gdy chcę podać zmienne predykcyjne jako wektor nazw zmiennych.

regression <- function(dv, ivs, data) {
    # run a linear model with text arguments for dv and ivs
    iv_string <- paste(ivs, collapse=" + ")
    regression_formula <- as.formula(paste(dv, iv_string, sep=" ~ "))
    lm(regression_formula, data)

}

Na przykład,

regression("y", PredictorVariables, Data)
Jeromy Anglim
źródło
2
+1. Cały czas używam tej techniki. Czasami jednak przechowywanie formuły w zmiennej powoduje problemy. Zobacz stackoverflow.com/a/7668846/210673, aby zapoznać się z użyciem do.calloceny formuły przed wywołaniem lm.
Aaron - Przywróć Monikę