3 votos

Automatización de la producción de criterios de selección de modelos

Quiero realizar una comparación de modelos según varios criterios utilizando R. El nombre de mi marco de datos es df

head(df)

   Y  X1  X2   X3   X4
1 18 307 130 3504 12.0
2 15 350 165 3693 11.5
3 18 318 150 3436 11.0
4 16 304 150 3433 12.0
5 17 302 140 3449 10.5
6 15 429 198 4341 10.0

Quiero comparar todas las combinaciones posibles con Y como variable dependiente. Te daré lo que he hecho hasta ahora para obtener el R.cuadrado para todos los modelos posibles. Me gustaría recibir sus comentarios para una mejor codificación, especialmente en conseguir todas esas fórmulas de modelo

# First get all possible combinations of the 4 inependent variables
comb_list <- lapply(1:4,function(i) combn(4,i))

# now create the formulas
comb_list_forms <- lapply(unlist(
  sapply(1:length(comb_list), function(i)
  sapply(1:dim(comb_list[[i]])[2], function(x) {nam <- names(df[1+comb_list[[i]][,x]])
  formul <- "Y~"
 sapply(1:length(nam), function(y) formul <<- paste(formul,nam[y],sep="+"))
 formul <- sub("~+", "~", formul,fixed = T)
 }))),as.formula)

# finally get r.squared
attach(df)
models.r.sq <- sapply(comb_list_forms, function(i) summary(lm(i))$r.squared)

Gracias

5voto

Marc-Andre R. Puntos 789

Creo que el paquete saltos te ayudará. Está diseñado específicamente para seleccionar un "mejor" subconjunto de variables para la regresión lineal.

En cuanto a la creación de fórmulas, puede utilizar el paquete foreach de la siguiente manera:

 #Create the list where each list element contains one combination
  xcomb <- foreach(i=1:4, .combine=c) %do% { 
       combn(paste("X", 1:4, sep=""), i, simplify=FALSE)
 }
 #Convert list elements to formula   
 formlist <- lapply(xcomb, function(l) formula(paste("Y", paste(l, collapse="+"), sep="~")))

4voto

DavLink Puntos 101

Ok, aquí hay otra forma (que ciertamente no es tan elegante o concisa como las otras, pero tiene el mérito de no requerir que Emacs compruebe las coincidencias de paréntesis :-)

Supongamos que tenemos un vector de predictores de interés como el siguiente

> Xs <- paste("X", 1:4, sep="")

Entonces, podemos utilizar

> allXs <- lapply(seq(along=Xs), 
                  function(x) combn(Xs, x, simplify=FALSE, 
                                    FUN=paste, collapse="+"))

donde

> unlist(allXs)

te da las 15 combinaciones de las X.

Otra opción es simplemente cambiar el lado derecho de una fórmula, por ejemplo

 fm <- as.formula(paste("Y ~ ", paste(Xs, collapse= "+")))

para reflejar las distintas combinaciones que enumera en su comb_list objeto. Esto puede hacerse utilizando la función Fórmula paquete:

> fm <- as.formula(paste("Y ~ ", paste(Xs, collapse= "|")))
> fm2 <- Formula(fm)
> foo <- function(x) formula(fm2, rhs=x, collapse=TRUE)
> foo(1:2)
Y ~ X1 + X2
<environment: 0x102593040>
> foo(c(1,3,4))
Y ~ X1 + X3 + X4
<environment: 0x1021d02a0>

3voto

reconbot Puntos 1670

Esta es otra forma de obtener las fórmulas

comb_list_forms <- unlist(lapply(1:length(comb_list), function(i)
  lapply(1:dim(comb_list[[i]])[2], function(x) 
    as.formula(paste("Y ~ ", paste(names(df[1+comb_list[[i]][,x]]), collapse= "+"))))))

2voto

Danny Whitt Puntos 111

Puede utilizar step en el modelo completo. Para ello se utiliza el AIC en lugar del $R^2$ como criterio de selección, ya que se considera superior.

En cualquier caso, las funciones add1 y drop1 que step usos pueden ser de utilidad.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X