Comment écrire une formule de modèle linéaire avec 100 variables dans R

22

Existe-t-il un moyen simple dans R de créer une régression linéaire sur un modèle avec 100 paramètres dans R? Disons que nous avons un vecteur Y avec 10 valeurs et un cadre de données X avec 10 colonnes et 100 lignes En notation mathématique, j'écrirais Y = X[[1]] + X[[2]] + ... + X[[100]]. Comment écrire quelque chose de similaire dans la syntaxe R?

Christian
la source
1
y en a-t-il 100 ou 1000? De plus, vous auriez normalement les colonnes être les variables et les lignes être des observations (il semble que ce soit inversé ici)
Macro
100, le 0 supplémentaire était une faute de frappe
Christian
2
Vraiment? Es-tu sûr de vouloir faire ça? Je serais préoccupé par le surajustement et la corrélation entre les combinaisons linéaires des prédicteurs. Non seulement cela, avec 100 prédicteurs mais seulement 10 observations, vous avez et la régression linéaire ne fonctionnera pas du tout. p>n
Aaron - Réintègre Monica

Réponses:

29

Essaye ça

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)
danas.zuokas
la source
4
Et si vous voulez, disons, toutes les interactions de second ordre, vous pouvez écrire y ~ . + .^2. Etc.
Lutz Prechelt
3
Et si vous ne voulez que certaines des interactions de second ordre, quelque chose comme y ~ . + .:x1vous obtiendra les interactions de chaque variable (sauf x1) avec x1. Etc; vous avez eu l'idée.
Lutz Prechelt
21

Excellentes réponses!

J'ajouterais que par défaut, faire appel formulaà a data.framecrée une formule additive pour régresser la première colonne sur les autres.

Donc, dans le cas de la réponse de @ danas.zuokas, vous pouvez même faire

lm(df)

qui est interprété correctement.

gui11aume
la source
Pourtant, cette réponse ne fonctionne pas si vous souhaitez mélanger en termes d'interaction. Le vôtre le fait (+1).
gui11aume
6
Je suis continuellement étonné de voir à quel point la plupart des Ropérateurs sont surchargés :)
Macro
19

Si chaque ligne est une observation et chaque colonne est un prédicteur de sorte que est un vecteur de longueur et est une matrice ( dans ce cas), alors vous pouvez le faire avecn X n × p p = 100YnXn×pp=100

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

S'il y a d'autres colonnes que vous ne vouliez pas inclure comme prédicteurs, vous devez les supprimer Xavant d'utiliser cette astuce ou les utiliser -dans la formule du modèle pour les exclure. Par exemple, si vous souhaitez exclure le 67e prédicteur (qui a le nom correspondant x67), vous pouvez écrire

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

De plus, si vous souhaitez inclure des interactions, etc., vous devrez les ajouter manuellement comme (par exemple)

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

ou assurez-vous qu'ils sont entrés sous forme de colonnes de X.

Macro
la source
19

Vous pouvez également utiliser une combinaison des fonctions formulaet paste.

Données de configuration : Imaginons que nous ayons un data.frame qui contient les variables prédictives x1de x100et notre variable dépendante y, mais qu'il existe également une variable de nuisance asdfasdf. Les variables prédictives sont également organisées dans un ordre tel qu'elles ne sont pas toutes contiguës dans le 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=""))

Imaginez également que vous ayez une chaîne contenant les noms des variables prédictives. Dans ce cas, cela peut facilement être créé à l'aide de la pastefonction, mais dans d'autres situations, grepou une autre approche peut être utilisée pour obtenir cette chaîne.

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

Appliquer l'approche : on peut alors construire une formule comme suit:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • l' collapseargument insère +entre les variables prédictives
  • formulaconvertit la chaîne en un objet de formule de classe adapté à la lmfonction.

Plus généralement, j'utilise la fonction suivante assez régulièrement lorsque je souhaite fournir une variable prédictive comme vecteur de nom de variable.

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)

}

Par exemple,

regression("y", PredictorVariables, Data)
Jeromy Anglim
la source
2
+1. J'utilise cette technique tout le temps. Parfois, cependant, avoir la formule stockée dans une variable provoque des problèmes. Voir stackoverflow.com/a/7668846/210673 pour l'utilisation de l' do.callévaluation de la formule avant d'appeler lm.
Aaron - Réintègre Monica