2012-02-11 18 views
31

Stavo cercando di automatizzare un pezzo del mio codice in modo che la programmazione diventi meno noiosa. Fondamentalmente stavo provando a fare una selezione stepwise delle variabili usando fastbw() nel pacchetto rms. Vorrei passare l'elenco delle variabili selezionate dal fastbw() in una formula come y ~ x1+x2+x3, "x1" "x2" "x3" essere l'elenco delle variabili selezionate da fastbw()passando un vettore di variabili nella formula lm()

Ecco il codice ho provato e non ha funzionato

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) 

Sono nuovo di R e non ha ancora seguito la curva di apprendimento ripida, quindi scusarsi per errori di programmazione ovvi. Qualsiasi aiuto è molto apprezzato

risposta

44

Sei quasi arrivato. Devi solo paste l'intero formula insieme, qualcosa di simile:

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

costringere ad una formula reale utilizzando as.formula e poi passare che a lm. Tecnicamente, penso che lo lm possa forzare una stringa di caratteri in sé, ma in genere è più sicuro costringerlo. (Alcune funzioni che prevedono formule non faranno la coercizione per te, altre lo faranno).

+0

JJoran, grazie, ho ancora l'errore Prega di dare un'occhiata HPI <- pasta ("byoy", "change18m", "change24m", "change18m0", "change24m0", "lag3byoy", "lag3change18m" , "lag3change24m", "lag6byoy", "lag6change18m", "lag6change24m", "trans_YoY", sep = "+") hpi.form <- as.formula (incolla ("roll_pct ~", "hpi", sep = "")) lmNGC0.r060 <- lm (hpi.form, sottoinsieme = helper == "POPNOANGC0_r060", na.action = na.exclude, data = modelready) > Errore in model.frame.default (formula = come .formula (incolla ("roll_pct ~", "hpi",: lunghezza variabile diversa (trovata per 'hpi') – Anand

+0

@ user1199861 Inserisci 'hpi' tra virgolette nella seconda riga. Digita' hpi.form' nella console e tu – joran

+0

Joran, grazie ancora una volta, penso che lm() non stia forzando l'oggetto "hpi" nella formula come stringa di caratteri, ma quando ho provato a digitare le variabili nella formula lm(), ha funzionato – Anand

13

In realtà bisognerebbe usare collasso invece di seb quando si definisce b.

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

allora si può mettere in risposta Joran

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

o semplicemente usare:

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

Mi sono imbattuto in problema simile oggi, se si vuole rendere ancora più generico in cui non è nemmeno necessario avere un nome di classe fisso, è possibile utilizzare

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

Questo presuppone che è variabile classe o la variabile dipendente nella prima colonna ma indicizzazione può essere facilmente commutata ultima colonna come:

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

Quindi continuare con lm utilizzando:

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

Se 're alla ricerca di qualcosa di meno verbose:

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

Qui è in una funzione:

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 
Problemi correlati