Como escrever sucintamente uma fórmula com muitas variables ​​de um quadro de dados?

Suponha que eu tenha uma variável de resposta e um dado contendo três covariables ​​(como um exemplo de brinquedo):

y = c(1,4,6) d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2)) 

Eu quero ajustar uma regressão linear para os dados:

 fit = lm(y ~ d$x1 + d$x2 + d$y2) 

Existe uma maneira de escrever a fórmula, para que eu não precise escrever cada covariável individual? Por exemplo, algo como

 fit = lm(y ~ d) 

(Eu quero que cada variável no quadro de dados seja uma covariável.) Eu estou perguntando porque eu realmente tenho 50 variables ​​no meu quadro de dados, então eu quero evitar escrever x1 + x2 + x3 + etc

Existe um identificador especial que pode ser usado em uma fórmula para significar todas as variables, é o . identificador.

 y <- c(1,4,6) d <- data.frame(y = y, x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2)) mod <- lm(y ~ ., data = d) 

Você também pode fazer coisas assim, para usar todas as variables, barra um:

 mod <- lm(y ~ . - x3, data = d) 

Tecnicamente . significa todas as variables não mencionadas anteriormente na fórmula . Por exemplo

 lm(y ~ x1 * x2 + ., data = d) 

onde . seria apenas referência x3 como x1 e x2 já estão na fórmula.

Uma abordagem ligeiramente diferente é criar sua fórmula a partir de uma string. Na página de ajuda da formula , você encontrará o seguinte exemplo:

 ## Create a formula for a model with a large number of variables: xnam <- paste("x", 1:25, sep="") fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+"))) 

Então, se você olhar a fórmula gerada, você receberá:

 R> fmla y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 

Sim, claro, apenas adicione a resposta y como primeira coluna no dataframe e chame lm() :

 d2<-data.frame(y,d) > d2 y x1 x2 x3 1 1 4 3 4 2 4 -1 9 -4 3 6 3 8 -2 > lm(d2) Call: lm(formula = d2) Coefficients: (Intercept) x1 x2 x3 -5.6316 0.7895 1.1579 NA 

Além disso, minhas informações sobre R indicam que a atribuição com <- é recomendada sobre = .

Uma extensão do método da juba é usar reformulate , uma function que é explicitamente projetada para tal tarefa.

 ## Create a formula for a model with a large number of variables: xnam <- paste("x", 1:25, sep="") reformulate(xnam, "y") y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 

Para o exemplo no OP, a solução mais fácil aqui seria

 # add y variable to data.frame d d <- cbind(y, d) reformulate(names(d)[-1], names(d[1])) y ~ x1 + x2 + x3 

ou

 mod <- lm(reformulate(names(d)[-1], names(d[1])), data=d) 

Observe que adicionar a variável dependente ao data.frame em d <- cbind(y, d) é preferível não apenas porque permite o uso de reformulate , mas também porque permite o uso futuro do object lm em funções como predict .

Eu construo esta solução, reformulate não se preocupa se os nomes das variables ​​têm espaços em branco.

 add_backticks = function(x) { paste0("`", x, "`") } x_lm_formula = function(x) { paste(add_backticks(x), collapse = " + ") } build_lm_formula = function(x, y){ if (length(y)>1){ stop("y needs to be just one variable") } as.formula( paste0("`",y,"`", " ~ ", x_lm_formula(x)) ) } # Example df <- data.frame( y = c(1,4,6), x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2) ) # Model Specification columns = colnames(df) y_cols = columns[1] x_cols = columns[2:length(columns)] formula = build_lm_formula(x_cols, y_cols) formula # output # "`y` ~ `x1` + `x2` + `x3`" # Run Model lm(formula = formula, data = df) # output Call: lm(formula = formula, data = df) Coefficients: (Intercept) x1 x2 x3 -5.6316 0.7895 1.1579 NA 

`` `

Você pode verificar os leaps pacotes e, em particular, as funções regsubsets() para a seleção do modelo. Conforme declarado na documentação:

Seleção de modelo por busca exaustiva, avanço ou retrocesso gradual ou substituição sequencial