Supongamos que tengo una variable de respuesta y datos que contienen tres covariables (como un ejemplo de juguete):
y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
Quiero ajustar una regresión lineal a los datos:
fit = lm(y ~ d$x1 + d$x2 + d$y2)
¿Hay alguna manera de escribir la fórmula, para que no tenga que escribir cada covariable individual? Por ejemplo, algo como
fit = lm(y ~ d)
(Quiero que cada variable en el marco de datos sea una covariable). Pregunto porque en realidad tengo 50 variables en mi marco de datos, por lo que quiero evitar escribirlas x1 + x2 + x3 + etc
.
Respuestas:
Hay un identificador especial que se puede usar en una fórmula para referirse a todas las variables, es el
.
identificador.También puede hacer cosas como esta, para usar todas las variables menos una (en este caso, se excluye x3):
Técnicamente,
.
significa todas las variables no mencionadas en la fórmula . Por ejemplodonde
.
solo haría referenciax3
comox1
yx2
ya están en la fórmula.fuente
.
técnicamente significa que todas las variables aúndata
no están en la fórmula .data
es una lista de la cual las variables en la fórmula se buscan desde esa lista, entonces sí. Un marco de datos, una lista o un entorno son opciones aceptables para eldata
argumento. Si eso no es lo que quieres decir, necesitarás expandirte un poco más.lm(d[[1]] ~ d[[3]] + ., data = d)
names
de la lista; supongamos que tienell <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))
, a continuación, los siguientes trabajos:lm(y ~ x + ., data = ll)
. Entonces, no hay muchas razones para tener sus datos de esta manera a menos que ya sea una lista, pero funciona. El requisito de que los elementos de la fórmula tengan la misma longitud impone algunas restricciones sobre lo que tiene en una lista. Los objetos más complejos probablemente necesiten código para extraer los elementos que desea; sid[[1]]
eran una trama de datos / Matrix necesita código para hacer que el trabajoUn enfoque ligeramente diferente es crear su fórmula a partir de una cadena. En la
formula
página de ayuda encontrará el siguiente ejemplo:Luego, si observa la fórmula generada, obtendrá:
fuente
Sí, por supuesto, solo agregue la respuesta
y
como primera columna en el marco de datos y solicítelalm()
:Además, mi información sobre R señala que
<-
se recomienda terminar la tarea con=
.fuente
foo(bar <- 1:10)
trabajo (ybar
se crean) perofoo(bar = 1:10)
fallarían porquebar
no es un argumentofoo
y tampoco crearánbar
.x3
NA
?Una extensión del método de juba es usar
reformulate
una función que está explícitamente diseñada para tal tarea.Para el ejemplo en el OP, la solución más fácil aquí sería
o
Tenga en cuenta que
d <- cbind(y, d)
se prefiere agregar la variable dependiente al data.frame in no solo porque permite el uso dereformulate
, sino también porque permite el uso futuro dellm
objeto en funciones comopredict
.fuente
Construyo esta solución,
reformulate
no me importa si los nombres de las variables tienen espacios en blanco.`` `
fuente
Puede consultar el paquete
leaps
y, en particular, las funciones deregsubsets()
función para la selección del modelo. Como se indica en la documentación:Selección de modelo por búsqueda exhaustiva, hacia adelante o hacia atrás paso a paso, o reemplazo secuencial
fuente