Supposons que j'ai une variable de réponse et une donnée contenant trois covariables (comme exemple de jouet):
y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
Je souhaite ajuster une régression linéaire aux données:
fit = lm(y ~ d$x1 + d$x2 + d$y2)
Existe-t-il un moyen d'écrire la formule, de sorte que je n'ai pas à écrire chaque covariable individuelle? Par exemple, quelque chose comme
fit = lm(y ~ d)
(Je veux que chaque variable de la trame de données soit une covariable.) Je demande parce que j'ai en fait 50 variables dans ma trame de données, donc je veux éviter d'écrire x1 + x2 + x3 + etc
.
Réponses:
Il existe un identifiant spécial que l'on peut utiliser dans une formule pour désigner toutes les variables, c'est l'
.
identifiant.Vous pouvez également faire des choses comme ça, pour utiliser toutes les variables sauf une (dans ce cas, x3 est exclu):
Techniquement, cela
.
signifie toutes les variables non déjà mentionnées dans la formule . Par exempleoù
.
ferait seulement référencex3
commex1
etx2
sont déjà dans la formule.la source
.
signifie techniquement que toutes les variablesdata
ne sont pas déjà dans la formule .data
est une liste à partir de laquelle les variables de la formule sont recherchées dans cette liste, alors oui. Un bloc de données, une liste ou un environnement sont des options acceptables pour l'data
argument. Si ce n'est pas ce que vous voulez dire, vous devrez vous développer un peu plus.lm(d[[1]] ~ d[[3]] + ., data = d)
names
de la liste; que vous avezll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))
, puis les travaux suivants:lm(y ~ x + ., data = ll)
. Il n'y a donc pas beaucoup de raisons d'avoir vos données comme ça à moins qu'il ne s'agisse déjà d'une liste, mais cela fonctionne. L'exigence que les éléments de la formule soient de la même longueur impose certaines restrictions à ce que vous avez dans une liste. Les objets plus complexes ont probablement besoin de code pour extraire les éléments souhaités; s'ild[[1]]
s'agissait d'une trame / matrice de données, vous avez besoin de code pour que cela fonctionneUne approche légèrement différente consiste à créer votre formule à partir d'une chaîne. Dans la
formula
page d'aide, vous trouverez l'exemple suivant:Ensuite, si vous regardez la formule générée, vous obtiendrez:
la source
Oui bien sûr, ajoutez simplement la réponse en
y
tant que première colonne dans le dataframe et appelezlm()
-la:En outre, mes informations sur R indiquent que l'affectation avec
<-
est recommandée=
.la source
foo(bar <- 1:10)
fonctionnent (etbar
sont créées) maisfoo(bar = 1:10)
échoueraient soit parce que cebar
n'est pas un argument defoo
et ne créera pas nonbar
plus.x3
NA
?Une extension de la méthode de juba est d'utiliser
reformulate
, une fonction qui est explicitement conçue pour une telle tâche.Pour l'exemple dans l'OP, la solution la plus simple ici serait
ou
Notez que l'ajout de la variable dépendante au data.frame dans
d <- cbind(y, d)
est préférable non seulement parce qu'il permet l'utilisation dereformulate
, mais aussi parce qu'il permet une utilisation future de l'lm
objet dans des fonctions telles quepredict
.la source
Je construis cette solution,
reformulate
ne fait pas attention si les noms de variables ont des espaces blancs.''
la source
Vous pouvez vérifier le package
leaps
et en particulier les fonctions deregsubsets()
fonction pour la sélection du modèle. Comme indiqué dans la documentation:Sélection du modèle par recherche exhaustive, en avant ou en arrière pas à pas, ou remplacement séquentiel
la source