2017-08-15 5 views
-1

Ich bin auf der Suche nach linearen Regression auf den folgenden Datenrahmen.Iterate über Variablen für die lineare Regression in R

test<-data.frame(abc=c(2.4,3.2,8.9,9.8,10.0,3.2,5.4), 
      city1_0=c(5.3,2.6,3,5.4,7.8,4.4,5.5), 
      city1_1=c(2.3,5.6,3,2.4,3.6,2.4,6.5), 
      city1_2=c(4.2,1.4,2.6,2,6,3.6,2.4), 
      city1_3=c(2.4,2.6,9.4,4.6,2.5,1.2,7.5), 
      city1_4=c(8.2,4.2,7.6,3.4,1.7,5.2,9.7), 
      city2_0=c(4.3,8.6,6,3.7,7.8,4.7,5.8),           city2_1=c(5.3,2.6,3,5.4,7.8,4.4,5.5)) 

Datenframe "Test" ist ein Beispiel für die Daten. Der ursprüngliche Datenrahmen enthält jedoch 100 Spalten. Ich möchte ein Skript zur Vorhersage von Werten mithilfe der linearen Regression erstellen. In diesem Fall möchte ich viele Modelle mit verschiedenen Eingabevariablen erstellen.

Zum Beispiel ist in dem gegebenen Datenrahmen abc die y-Variable. Ich möchte ein Modell city1_1, city1_2, city1_3, city1_4 (city1_0, city2_0) erstellen. Dann anderes Modell mit city1_2, city1_3, city1_4 (city1_0, city1_1, city2_0, city2_1) und dann 3. Modell mit Eingabevariable city1_3, city1_4 (city1_0 verlassen, city1_1, city1_2, city2_0, city2_1) und so weiter.

Diese Variablen werden in die lineare Regression eingegeben.

Dies muss ich für 40 Datenrahmen tun. Der O/P-Variablenname bleibt für jeden Datenrahmen gleich.

+0

Was ist das Muster auf die Kombinationen Sie versuchen wollen? Ein gängiger Ansatz besteht darin, Variablennamen als Strings einzufügen und dann 'lapply (string_formulas, function (form) {lm (as.formula (form), data = df})' '. Das heißt, ein gründlicherer Ansatz für die Auswahl von Features Die LASSO könnte eine bessere Idee sein. – alistaire

+0

@allstaire, Eigentlich, wenn ich alle 1 Suffixvariablen verwende, möchte ich nicht 0 Suffixvariablen in meinem Modell verwenden, und wenn ich 2 suffixed Variablen verwende, ich don ' Ich möchte die Variablen mit den Suffixen von 0 und 1 in meinem zweiten Modell verwenden usw. Im Grunde muss ich viele Multiplikatoren-Modelle basierend auf den Variablen erstellen Wie funktioniert das? – User0590

+0

Dies ist ein exakter Umtausch einer früheren Frage Machen Sie etwas Arbeit, um den Basiscode zu bekommen, und bitten Sie um Hilfe. – sconfluentus

Antwort

0

Sie eine Liste von Formeln regulären Ausdruck erstellen können, und dann lapply über diese Liste:

# create data 
test<-data.frame(abc=c(2.4,3.2,8.9,9.8,10.0,3.2,5.4), 
      city1_0=c(5.3,2.6,3,5.4,7.8,4.4,5.5), 
      city1_1=c(2.3,5.6,3,2.4,3.6,2.4,6.5), 
      city1_2=c(4.2,1.4,2.6,2,6,3.6,2.4), 
      city1_3=c(2.4,2.6,9.4,4.6,2.5,1.2,7.5), 
      city1_4=c(8.2,4.2,7.6,3.4,1.7,5.2,9.7), 
      city2_0=c(4.3,8.6,6,3.7,7.8,4.7,5.8),           
      city2_1=c(5.3,2.6,3,5.4,7.8,4.4,5.5)) 

# create list of formulas 
myformulas <- list(as.formula(paste("abc", paste(grep("city1_[123456789]", names(test), value = TRUE), collapse = " + "), sep = " ~ ")), 
        as.formula(paste("abc", paste(grep("city1_[23456789]", names(test), value = TRUE), collapse = " + "), sep = " ~ ")), 
        as.formula(paste("abc", paste(grep("city1_[3456789]", names(test), value = TRUE), collapse = " + "), sep = " ~ "))) 

# check formulas 
> myformulas 
[[1]] 
abc ~ city1_1 + city1_2 + city1_3 + city1_4 

[[2]] 
abc ~ city1_2 + city1_3 + city1_4 

[[3]] 
abc ~ city1_3 + city1_4 


# loop over formulas 
mylms <- lapply(myformulas, function(x) lm(x, data = test)) 


# get output of linear regressions 
> mylms 
[[1]] 

Call: 
lm(formula = x, data = test) 

Coefficients: 
(Intercept)  city1_1  city1_2  city1_3  city1_4 
    5.8987  -0.2480  0.6316  1.1810  -1.0420 


[[2]] 

Call: 
lm(formula = x, data = test) 

Coefficients: 
(Intercept)  city1_2  city1_3  city1_4 
    4.8903  0.7114  1.1673  -1.0595 


[[3]] 

Call: 
lm(formula = x, data = test) 

Coefficients: 
(Intercept)  city1_3  city1_4 
     7.909  1.047  -1.102 

Sie könnten sogar die grep() Muster prespecify und die Formeln mit einer Schleife erstellen:

mygreps <- c("city1_[123456789]", "city1_[23456789]", "city1_[3456789]") 

myformulas <- lapply(mygreps, function(x) as.formula(paste("abc", paste(grep(x, names(test), value = TRUE), collapse = " + "), sep = " ~ "))) 

Bearbeiten:

Sie können Definieren Sie auch nur den Wertebereich der Variablen city und verwenden Sie paste(), um die Strings zu generieren.

Beispiel:

myranges <- lapply(1:16, function(x) x:16) 
myvars <- paste0("city", 1:10, "_") 

daraus Dann wird die Formeln mit einem verschachtelten lapply() Anruf erstellen:

myformulas <- lapply(myvars, function(x) lapply(myranges, function(y) as.formula(paste("abc", paste(x, y, sep = "", collapse = " + "), sep = " ~ ")))) 

myformulas nun 10-Listen enthalten wird (ein für jeden city1_ zu city10_) mit 16 Formeln in jeder Liste (jeweils einschließlich einer dekrementierenden Menge von Variablen, beginnend mit allen 16 und endend mit nur cityX_16).

Jetzt nur noch eine Schleife über myformulas eine Liste der linearen Regression Ausgabe zu erhalten:

# loop over formulas 
mylms <- lapply(myformulas, function(x) lapply(x, function(y) lm(y, data = test))) 
+0

Danke für die Lösung.Aber ich habe Variable beginnend von city1_1 ..... city1_16 bis city10_1 ....... city10_16. Wie geht das in diesem Code? Denn jedes Mal, wenn der Name der Stadt geschrieben wird, ist das nicht möglich. Es wird ewig dauern. – User0590

+0

Ich habe eine andere Version bearbeitet. Dies erstellt eine Liste von Formeln für alle 10 Stadtvariablen mit jeweils 16 Formeln (beginnend mit allen 'cityX_1' bis' cityX_16' und endend mit nur 'cityX_16' als Prädiktoren). – LAP

+0

vielen dank, Lap !! – User0590