2012-11-09 18 views
5

Ich versuche 96 Regressionen auszuführen und speichern Sie die Ergebnisse als 96 verschiedene Objekte. Um die Dinge zu komplizieren, möchte ich, dass der Index einer der Kovariaten im Modell ebenfalls 96 Mal geändert wird. Ich habe das Problem fast gelöst, aber ich habe leider eine Wand getroffen. Der Code so weit ist,Schleife durch Kovariaten in Regression mit R

for(i in 1:96){ 

    assign(paste("z.out", i,sep=""), lm(rMonExp_EGM~ TE_i + Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
    Month10+Month11+Month12+Yrs_minus_2004 + 
    as.factor(LGA),data=Pokies)) 

} 

Dieses auf der Objekterstellung Seite funktioniert (zum Beispiel habe ich z.out1 - z.out96), aber ich kann nicht scheinen, den Index auf der Kovariate zu erhalten als auch zu ändern.

Ich habe 96 Variablen namens TE_1, TE_2 ... TE_96 im Datensatz. Als solches muss der Index auf TE_ das "i" ändern, um jedem der Objekte, die ich erstelle, zu entsprechen. Das heißt, z.out1 sollten die Ergebnisse aus diesem Modell halten:

z.out1 <- lm(rMonExp_EGM~ TE_1 + Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
    Month10+Month11+Month12+Yrs_minus_2004 + as.factor(LGA),data=Pokies) 

Und z.out96 sein sollte:

z.out96 <- lm(rMonExp_EGM~ TE_96+ Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
    Month10+Month11+Month12+Yrs_minus_2004 + as.factor(LGA),data=Pokies) 

Hoffentlich macht Sinn. Ich bin dankbar für irgendwelche Tipps/Ratschläge.

+0

Aber abgesehen von den Prog Ramming-Problem, sollten Sie wahrscheinlich über CrossValidate über LM auf einer Zeitreihe als einzelne Faktoren neu denken oder fragen. Das Ergebnis ist definitiv irreführend oder einfach falsch. –

Antwort

7

würde ich die Ergebnisse in einer Liste setzen und vermeiden die for loop und assign Aussagen

Sie eine Kombination aus reformulate verwenden können und update Ihre Formel

orig_formula <- MonExp_EGM~ Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
Month10+Month11+Month12+Yrs_minus_2004 + as.factor(LGA) 


te_variables <- paste0('TE_', 1:96) 
# Or if you don't have a current version of R 
# te_variables <- paste('TE', 1:96, sep = '_') 

new_formula <- lapply(te_variables, function(x,orig = orig_formula) { 
    new <- reformulate(c(x,'.')) 
    update(orig, new)}) 
## it works!  
new_formula[[1]] 
## MonExp_EGM ~ TE_1 + Month2 + Month3 + Month4 + Month5 + Month6 + 
## Month7 + Month8 + Month9 + Month10 + Month11 + Month12 + 
## Yrs_minus_2004 + as.factor(LGA) 
new_formula[[2]] 
## MonExp_EGM ~ TE_2 + Month2 + Month3 + Month4 + Month5 + Month6 + 
## Month7 + Month8 + Month9 + Month10 + Month11 + Month12 + 
## Yrs_minus_2004 + as.factor(LGA) 


models <- lapply(new_formula, lm, data = pokies) 

Es jetzt 96 Elemente sein sollte zu schaffen, in die Liste models

Sie können sie benennen, um Ihre ursprünglich geplanten nnames

widerzuspiegeln
names(models) <- paste0('z.out', 1:96) 
# or if you don't have a current version of R 
# names(models) <-paste('z.out', 1:96 ,sep = '') 

und dann ein einziges Modell zugreifen, indem

models$z.out5 

etc

oder alle Modelle Zusammenfassungen von

summaries <- lapply(models, summary) 

etc erstellen ....

# just the coefficients 
coefficients <- lapply(models, coef) 

# the table with coefficient estimates and standard.errors 

coef_tables <- apply(summaries, '[[', 'coefficients') 
+0

danke! Dies macht den Trick. Angenommen, ich möchte Koeffizienten aus den Modellen extrahieren. Wäre es dann sinnvoll, eine for-Schleife zu verwenden? Beispiel - bumpkis <- Matrix (nrow = 96, ncol = 1) für (i in 1:96) { bumpkis [i,] <- c (Modelle $ z.out (i) $ Koeffizienten [2]) } Dies funktioniert leider nicht, weil ich nicht das ich zum arbeiten bekomme. Ich denke, ich vermisse etwas Grundlegendes über Schleifen. – kpeyton

+0

Nein. Siehe meine Beispiele in der bearbeiteten Lösung. Für diese Art von Aktivität funktionieren Schleifen, aber eine idiomatische R-Lösung besteht darin, "lapply" zu verwenden. Deine Verwendung des 'i' in' models $ z.out (i) 'wäre falsch. Probiere 'models [[einfügen ('z.out', i, sep = '']]]'. Sie können '$' nicht verwenden – mnel

Verwandte Themen