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
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.)
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 = "")
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, ... )
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
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)
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