style link div r main regression glm

link - Especificar fórmula en R con glm sin declaración explícita de cada covariable



tags$div shiny (2)

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 ahora.

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, esto tiene un atajo fácil:

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

Pero digamos 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?

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

Bien, ¿y qué pasa con este?

Quiero omitir una variable de términos principales 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 unas pocas variables no es realmente necesario un acceso directo, pero trabajo con datos de alta dimensión. El conjunto de datos actual tiene "solo" 200 variables, pero algunas otras tienen miles y miles.


Aniko respondió a su 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 nombre, en estructura, lo que sea) para completar el marco de datos, me permite seleccionar rápidamente grupos de variables en grandes conjuntos de datos.


Su uso de . Creativamente, construir una fórmula que contenga 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 en una fórmula usando as.formula :

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

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