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

Estaba tratando de automatizar una parte de mi código para que la progtwigción sea menos tediosa. Básicamente, estaba tratando de hacer una selección gradual 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” es 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, así que discúlpate por los obvios errores de progtwigción. Cualquier ayuda es muy apreciada

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

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

forzarlo a una fórmula real usando as.formula y luego pasarlo a lm . Técnicamente, creo que lm puede forzar una cadena de caracteres en sí misma, pero coerciéndola usted mismo es generalmente más seguro. (Algunas funciones que esperan que las fórmulas no hagan la coerción por ti, otras lo harán).

En realidad, necesitaría usar colapso en lugar de seb al definir b.

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

Entonces puedes ponerlo en la respuesta joran

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

o simplemente usa:

 paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "") 

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

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

Esto supone que tiene una 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 continúe con lm usando:

 bestp.OAW0.r060 <- lm(frmla , data = modelready, ... ) 

Si buscas 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 

solo para simplificar y recoger las respuestas anteriores, en función de 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)