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 referenciax3comox1yx2ya están en la fórmula.fuente
.técnicamente significa que todas las variables aúndatano están en la fórmula .dataes 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 eldataargumento. Si eso no es lo que quieres decir, necesitarás expandirte un poco más.lm(d[[1]] ~ d[[3]] + ., data = d)namesde 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
formulapágina de ayuda encontrará el siguiente ejemplo:Luego, si observa la fórmula generada, obtendrá:
fuente
Sí, por supuesto, solo agregue la respuesta
ycomo 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 (ybarse crean) perofoo(bar = 1:10)fallarían porquebarno es un argumentofooy tampoco crearánbar.x3NA?Una extensión del método de juba es usar
reformulateuna 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 dellmobjeto en funciones comopredict.fuente
Construyo esta solución,
reformulateno me importa si los nombres de las variables tienen espacios en blanco.`` `
fuente
Puede consultar el paquete
leapsy, 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