2010-08-28 11 views
18

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.Especificando fórmula en R con glm sin declaración explícita de cada covariable

Por ejemplo (con sólo 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 decir que quiero incluir toda principal términos (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?

[autoedición antes de la publicación:] ¡Esto funciona! glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

Bien, entonces ¿qué hay de este?

quiero omitir uno términos principales variables e incluyen sólo 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 sólo unas pocas variables sin acceso directo se realmente es necesario, pero trabajo con datos de alta dimensión. El conjunto de datos actual tiene "solo" 200 variables, pero algunas otras tienen miles y miles.

+1

Oh wow, lo siento mucho, ¡también descubrí mi segunda pregunta! glm (Y ~.-W1 + A * I (W2^2), familia = binomial, data = samp) Ojalá esto ayude a otra persona, por lo que no está mal tenerlo aquí –

Respuesta

19

Su 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 convertirlo a la fórmula usando as.formula:

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

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

13

Aniko respondió a tu pregunta. Para ampliar un poco:

También puede excluir las variables utilizando -:

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

Para grandes grupos de variables, a menudo hacer un marco para agrupar las variables, lo que le 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) 

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

Cuestiones relacionadas