pasar un vector de variables a la fórmula lm()


Estaba tratando de automatizar una parte de mi código para que la programación sea menos tediosa. Básicamente estaba tratando de hacer una selección escalonada de variables usando fastbw() en el paquete rms. Me gustaría pasar la lista de variables seleccionadas por fastbw() en una fórmula como y ~ x1+x2+x3, "x1" "x2" "x3" la lista de variables seleccionadas por fastbw()

Aquí está el código que probé y no funcionó

olsOAW0.r060 <- ols(roll_pct~byoy+trans_YoY+change18m, 
                    subset= helper=="POPNOAW0_r060", 
                    na.action = na.exclude, 
                    data = modelready)

OAW0 <- fastbw(olsOAW0.r060, rule="p", type="residual", sls= 0.05)

vec <- as.vector(OAW0$names.kept, mode="any")

b <- paste(vec, sep ="+") ##I even tried b <- paste(OAW0$names.kept, sep="+")

bestp.OAW0.r060 <- lm(roll_pct ~ b , 
                      data = modelready, 
                      subset = helper =="POPNOAW0_r060",    
                      na.action = na.exclude)

Soy nuevo en R y todavía no he seguido la curva de aprendizaje empinada, así que discúlpate por obvios errores de programación. Cualquier ayuda es muy apreciada

 34
Author: epo3, 2012-02-11

5 answers

Ya casi estás ahí. Solo tienes que paste la fórmula completa juntos, algo como esto:

paste("roll_pct ~ ",b,sep = "")

Coaccionar a una fórmula real usando as.formula y, a continuación, pasar que a lm. Técnicamente, creo que lm puede coaccionar una cadena de caracteres en sí, pero coaccionar a sí mismo es generalmente más seguro. (Algunas funciones que esperan fórmulas no harán la coerción por usted, otras lo harán.)

 47
Author: joran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-11 06:08:43

En realidad tendría que usar collapse en lugar de seb al definir b.

b <- paste(OAW0$names.kept, collapse="+")

Entonces puedes ponerlo en la respuesta de joran

paste("roll_pct ~ ",b,sep = "")

O simplemente use:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")
 15
Author: cconnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 01:21:17

Me encontré con un problema similar hoy, si quieres hacerlo aún más genérico donde ni siquiera tienes que tener un nombre de clase fijo, puedes usar

frmla <- as.formula(paste(colnames(modelready)[1], paste(colnames(modelready)[2:ncol(modelready)], sep = "", 
                              collapse = " + "), sep = " ~ "))

Esto asume que tiene la variable de clase o la variable dependiente en la primera columna, pero la indexación se puede cambiar fácilmente a la última columna como:

frmla <- as.formula(paste(colnames(modelready)[ncol(modelready)], paste(colnames(modelready)[1:(ncol(modelready)-1)], sep = "", 
                              collapse = " + "), sep = " ~ "))

Luego continuar con lm usando:

bestp.OAW0.r060 <- lm(frmla , data = modelready, ... )
 6
Author: discipulus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 13:27:32

Si estás buscando algo menos detallado:

fm <- as.formula( paste( colnames(df)[i], ".", sep=" ~ ")) 
                                      # i is the index of the outcome column

Aquí está en una función:

getFormula<-function(target, df) {

  i <- grep(target,colnames(df))
  as.formula(paste(colnames(df)[i], 
                   ".", 
                   sep = " ~ "))
}
fm <- getFormula("myOutcomeColumnName", myDataFrame)
rp <- rpart(fm, data = myDataFrame) # Use the formula to build a model
 1
Author: Travis Heeter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-03 20:43:23

Solo para simplificar y recopilar las respuestas anteriores, basadas en una función

my_formula<- function(colPosition, trainSet){
    dep_part<- paste(colnames(trainSet)[colPosition],"~",sep=" ")
    ind_part<- paste(colnames(trainSet)[-colPosition],collapse=" + ")
    dt_formula<- as.formula(paste(dep_part,ind_part,sep=" "))
    return(dt_formula)
}

Para usarlo:

my_formula( dependent_var_position, myTrainSet)
 0
Author: user3169330,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 20:14:40