Especificando la fórmula en R con glm sin statement explícita de cada covariable

Me gustaría forzar variables específicas en regresiones glm sin especificar completamente cada una. Mi conjunto de datos real tiene ~ 200 variables. No he podido encontrar muestras de esto en mi búsqueda en línea hasta el momento.

Por ejemplo (con solo 3 variables):

n=200 set.seed(39) samp = data.frame(W1 = runif(n, min = 0, max = 1), W2=runif(n, min = 0, max = 5)) samp = transform(samp, # add A A = rbinom(n, 1, 1/(1+exp(-(W1^2-4*W1+1))))) samp = transform(samp, # add Y Y = rbinom(n, 1,1/(1+exp(-(A-sin(W1^2)+sin(W2^2)*A+10*log(W1)*A+15*log(W2)-1+rnorm(1,mean=0,sd=.25)))))) 

Si quiero incluir todos los términos principales, tiene un atajo sencillo:

 glm(Y~., family=binomial, data=samp) 

Pero supongamos que quiero incluir todos los términos principales (W1, W2 y A) más W2 ^ 2:

 glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp) 

¿Hay un atajo para esto?

[editar uno mismo antes de publicar:] Esto funciona! glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

De acuerdo, entonces ¿qué hay de este?

Quiero omitir una variable de términos principal e incluir solo dos términos principales (A, W2) y W2 ^ 2 y W2 ^ 2: A:

 glm(Y~A+W2+A*I(W2^2), family=binomial, data=samp) 

Obviamente, con solo algunas variables, no se necesitan atajos, pero trabajo con datos de gran dimensión. El conjunto de datos actual tiene “solo” 200 variables, pero algunas otras tienen miles y miles.

Tu uso de . creativamente para construir la fórmula que contiene todas o casi todas las variables es un enfoque bueno y limpio. Otra opción que es útil a veces es construir la fórmula programáticamente como una cadena, y luego convertirla a la fórmula usando as.formula :

 vars <- paste("Var",1:10,sep="") fla <- paste("y ~", paste(vars, collapse="+")) as.formula(fla) 

Por supuesto, puedes hacer que el objeto fla mucho más complicado.

Aniko respondió tu pregunta. Para extender un poco:

También puede excluir variables usando -:

 glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp) 

Para grupos grandes de variables, a menudo hago un marco para agrupar las variables, lo que te permite hacer algo como:

 vars <- data.frame( names = names(samp), main = c(T,F,T,F), quadratic =c(F,T,T,F), main2=c(T,T,F,F), stringsAsFactors=F ) regform <- paste( "Y ~", paste( paste(vars[vars$main,1],collapse="+"), paste(vars[1,1],paste("*I(",vars[vars$quadratic,1],"^2)"),collapse="+"), sep="+" ) ) > regform [1] "Y ~ W1+A+W1 *I( W2 ^2)+W1 *I( A ^2)" > glm(as.formula(regform),data=samp,family=binomial) 

El uso de todo tipo de condiciones (en el nombre, en la estructura, lo que sea) para llenar el dataframe, me permite seleccionar rápidamente grupos de variables en grandes conjuntos de datos.

    Intereting Posts