Come scrivere una formula di modello lineare con 100 variabili in R


22

Esiste un modo semplice in R per creare una regressione lineare su un modello con 100 parametri in R? Diciamo che abbiamo un vettore Y con 10 valori e un frame di dati X con 10 colonne e 100 righe In notazione matematica scriverei Y = X[[1]] + X[[2]] + ... + X[[100]]. Come scrivo qualcosa di simile nella sintassi R?


1
ce ne sono 100 o 1000? Inoltre, normalmente avresti le colonne come variabili e le righe come osservazioni (sembra che qui sia invertito)
Macro,

100 lo 0 in più era un refuso
Christian

2
Veramente? Sei sicuro di volerlo fare? Sarei preoccupato per eccesso di adattamento e correlazione tra combinazioni lineari dei predittori. Non solo, con 100 predittori ma solo 10 osservazioni, hai e la regressione lineare non funzionerà affatto. p>n
Aaron - Ripristina Monica

Risposte:


29

Prova questo

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)

4
E se vuoi, per esempio, tutte le interazioni del secondo ordine, puoi scrivere y ~ . + .^2. E così via.
Lutz Prechelt,

3
E se vuoi solo alcune delle interazioni del secondo ordine, qualcosa del genere y ~ . + .:x1ti porterà le interazioni di ogni variabile (tranne x1) con x1. E così via; hai avuto l'idea.
Lutz Prechelt,

21

Grandi risposte!

Vorrei aggiungere che per impostazione predefinita, invocare formulauna data.framecrea una formula additiva per regredire la prima colonna sulle altre.

Quindi, nel caso della risposta di @ danas.zuokas, puoi persino farlo

lm(df)

che è interpretato correttamente.


Tuttavia, questa risposta non funziona se si desidera mescolare in termini di interazione. Lo fa (+1).
gui11aume,

6
Sono continuamente stupito di quanto siano sovraccarichi gli Roperatori della maggior parte :)
Macro,

19

YnXn×pp=100

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

Se ci sono altre colonne che non volevi includere come predittori, dovresti rimuoverle Xprima di utilizzare questo trucco o utilizzare -nella formula del modello per escluderle. Ad esempio, se si desidera escludere il 67 ° predittore (che ha il nome corrispondente x67), è possibile scrivere

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

Inoltre, se si desidera includere interazioni, ecc., È necessario aggiungerle manualmente come (ad esempio)

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

o assicurarsi che siano inseriti come colonne di X.


19

È inoltre possibile utilizzare una combinazione delle funzioni formulae paste.

Dati di configurazione : Immaginiamo che abbiamo un data.frame che contiene le variabili predittive x1per x100e la nostra variabile dipendente y, ma che c'è anche una variabile fastidio asdfasdf. Anche le variabili predittive sono disposte in un ordine in modo tale che non siano tutte contigue nel 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=""))

Immagina anche di avere una stringa contenente i nomi delle variabili predittive. In questo caso, questo può essere facilmente creato usando la pastefunzione, ma in altre situazioni, grepo qualche altro approccio potrebbe essere usato per ottenere questa stringa.

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

Applica approccio : possiamo quindi costruire una formula come segue:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • l' collapseargomento si inserisce +tra le variabili predittive
  • formulaconverte la stringa in un oggetto di formula di classe adatto alla lmfunzione.

Più in generale, uso la seguente funzione abbastanza regolarmente quando voglio fornire una variabile predittore come vettore di nomi di variabili.

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)

}

Per esempio,

regression("y", PredictorVariables, Data)

2
+1. Uso questa tecnica tutto il tempo. Occasionalmente, tuttavia, la memorizzazione della formula in una variabile causa problemi. Vedi stackoverflow.com/a/7668846/210673 per l'uso di do.callvalutare la formula prima di chiamare lm.
Aaron - Ripristina Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.