it-swarm.com.de

Übergeben Sie einen Vektor von Variablen in die Formel lm ()

Ich habe versucht, einen Teil meines Codes zu automatisieren, damit das Programmieren weniger langweilig wird.

Im Grunde habe ich versucht, eine schrittweise Auswahl von Variablen mithilfe von fastbw() im Paket rms vorzunehmen. Ich möchte die Liste der von fastbw() ausgewählten Variablen in eine Formel als y ~ x1+x2+x3 übergeben, wobei "x1" "x2" "x3" die Liste der durch fastbw() ausgewählten Variablen ist.

Hier ist der Code, den ich ausprobiert habe und nicht funktioniert habe

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)

Ich bin neu bei R und habe die steile Lernkurve noch nicht hinter sich gelassen, entschuldigen Sie sich also für offensichtliche Programmierfehler. 

36
Anand

Du bist fast da. Sie müssen lediglich die gesamte - Formel zusammen paste so etwas wie folgt:

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

erzwingen Sie es mit as.formula zu einer aktuellen Formel und übergeben Sie that an lm. Technisch denke ich, dass lm eine Zeichenfolge selbst erzwingen kann, aber es selbst zu erzwingen, ist im Allgemeinen sicherer. (Einige Funktionen, die Formeln erwarten, sind für Sie nicht zwingend, andere tun dies.)

52
joran

Sie müssten bei der Definition von b collaps anstelle von seb verwenden. 

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

Dann können Sie es in joran Antwort setzen

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

oder benutzen Sie einfach:

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

Ich bin heute auf ein ähnliches Problem gestoßen. Wenn Sie es noch generischer machen wollen, wenn Sie nicht einmal einen festen Klassennamen haben müssen, können Sie ihn verwenden 

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

Dies setzt voraus, dass Sie in der ersten Spalte eine Klassenvariable oder die abhängige Variable haben. Die Indizierung kann jedoch einfach auf die letzte Spalte umgestellt werden:

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

Dann weiter mit lm mit:

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

Wenn Sie nach etwas weniger ausführlichem suchen:

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

Hier ist es in einer Funktion:

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
Travis Heeter

nur um die Antworten zu vereinfachen und zu sammeln, basierend auf einer Funktion

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)
}

Um es zu benutzen:

my_formula( dependent_var_position, myTrainSet)
0
user3169330