2016-07-06 6 views
0

Ich habe einen Datenrahmen von 12 Prädiktoren und eine Liste von Zahlen namens BEI (die ich vorherzusagen möchte). Ich möchte schrittweise Auswahl auf jeder 12 Zeilen von Daten, zum Beispiel 1:12, 2:13 und usw. ausführen. Für jedes Rollen, möchte ich die Koeffizienten zurückgeben und die Koeffizienten verwenden, um BEI vorherzusagen. Unten ist mein Code:Rolling schrittweise Regression in R

k = length(BEI) 
coef.list <- numeric() 
predicted.list <- numeric() 
for(i in 1:(k-11)){ 
    BEI.subset <- BEI[i:(i+11)] 
    predictors.subset <- predictors[c(i:(i+11)),] 
    fit.stepwise <- regsubsets(BEI.subset~., data = predictors.subset, nvmax = 10, method = "forward") 
    fit.summary <- summary(fit.stepwise) 
    id <- which.min(fit.summary$cp) 
    coefficients <- coef(fit.stepwise,id) 
    coef.list <- append(coef.list, coefficients) 
    form <- as.formula(fit.stepwise$call[[2]]) 
    mat <- model.matrix(form,predictors.subset) 
    predicted.stepwise <- mat[,names(coefficients)]%*%coefficients 
    predicted.list <- append(predicted.list, predicted.stepwise) 
} 

und ich bekam die Fehler wie folgt aus: Neuordnen Variablen und es erneut versuchen: 50 Es waren oder mehrere Warnungen (Verwendung Warnungen(), um die ersten 50 zu sehen)

die Warnungen sind: 1: In sprüngen.setup (x, y, wt = wt, nbest = nbest, nvmax = nvmax, ...: 1 lineare Abhängigkeiten gefunden 2: In sprüngen.setup (x, y, wt = wt, nbest = nbest, nvmax = nvmax, ...: 1 lineare Abhängigkeiten gefunden 3: In sprüngen.setup (x, y, wt = wt, nbest = nbest, nvmax = nvmax, ...: 1 lineare Abhängigkeiten gefunden .... usw.

Wie behebe ich das? Oder ist das ein besserer Weg, die Codes zu schreiben?

Antwort

0

Der Grund, warum Sie auf den Fehler stoßen, ist auf fehlende Werte (NA) für rollende Datenuntergruppen zurückzuführen.

Mit den Daten (swiss) als Beispiel:

dim(swiss) 
# [1] 47 6 

split_swiss <- lapply(1:nrow(swiss), function(x) swiss[x:(x+11),]) 
length(split_swiss) 
# [1] 47 ## rolling subset produce 47 data.frames. 

lapply(tail(split_swiss), head) # show the first 6 rows of the last 6 data.frames 
[[1]] 
      Fertility Agriculture Examination Education Catholic Infant.Mortality 
Neuchatel   64.4  17.6   35  32 16.92    23.0 
Val de Ruz  77.6  37.6   15   7  4.97    20.0 
ValdeTravers  67.6  18.7   25   7  8.65    19.5 
V. De Geneve  35.0   1.2   37  53 42.34    18.0 
Rive Droite  44.7  46.6   16  29 50.43    18.2 
Rive Gauche  42.8  27.7   22  29 58.33    19.3 

[[2]] 
      Fertility Agriculture Examination Education Catholic Infant.Mortality 
Val de Ruz  77.6  37.6   15   7  4.97    20.0 
ValdeTravers  67.6  18.7   25   7  8.65    19.5 
V. De Geneve  35.0   1.2   37  53 42.34    18.0 
Rive Droite  44.7  46.6   16  29 50.43    18.2 
Rive Gauche  42.8  27.7   22  29 58.33    19.3 
NA     NA   NA   NA  NA  NA    NA 

[[3]] 
      Fertility Agriculture Examination Education Catholic Infant.Mortality 
ValdeTravers  67.6  18.7   25   7  8.65    19.5 
V. De Geneve  35.0   1.2   37  53 42.34    18.0 
Rive Droite  44.7  46.6   16  29 50.43    18.2 
Rive Gauche  42.8  27.7   22  29 58.33    19.3 
NA     NA   NA   NA  NA  NA    NA 
NA.1    NA   NA   NA  NA  NA    NA 

[[4]] 
      Fertility Agriculture Examination Education Catholic Infant.Mortality 
V. De Geneve  35.0   1.2   37  53 42.34    18.0 
Rive Droite  44.7  46.6   16  29 50.43    18.2 
Rive Gauche  42.8  27.7   22  29 58.33    19.3 
NA     NA   NA   NA  NA  NA    NA 
NA.1    NA   NA   NA  NA  NA    NA 
NA.2    NA   NA   NA  NA  NA    NA 

[[5]] 
      Fertility Agriculture Examination Education Catholic Infant.Mortality 
Rive Droite  44.7  46.6   16  29 50.43    18.2 
Rive Gauche  42.8  27.7   22  29 58.33    19.3 
NA     NA   NA   NA  NA  NA    NA 
NA.1    NA   NA   NA  NA  NA    NA 
NA.2    NA   NA   NA  NA  NA    NA 
NA.3    NA   NA   NA  NA  NA    NA 

[[6]] 
      Fertility Agriculture Examination Education Catholic Infant.Mortality 
Rive Gauche  42.8  27.7   22  29 58.33    19.3 
NA     NA   NA   NA  NA  NA    NA 
NA.1    NA   NA   NA  NA  NA    NA 
NA.2    NA   NA   NA  NA  NA    NA 
NA.3    NA   NA   NA  NA  NA    NA 
NA.4    NA   NA   NA  NA  NA    NA 

Ein Fehler würde folgen, wenn Sie regsubsets mit dieser data.frames laufen sind, wo es mehr als Prädiktoren Fälle ist.

lapply(split_swiss, function(x) regsubsets(Fertility ~., data=x, nvmax=10, method="forward")) 

Error in leaps.setup(x, y, wt = wt, nbest = nbest, nvmax = nvmax, force.in = force.in, : 
    y and x different lengths In addition: Warning messages: 
1: In leaps.setup(x, y, wt = wt, nbest = nbest, nvmax = nvmax, force.in = force.in, : 
    1 linear dependencies found 
...... 

Stattdessen kann ich nur Teilmengen mit 12 Reihen behalten und wie dies mit der Regression weiter:

split_swiss_2 <- split_swiss[sapply(lapply(split_swiss, na.omit), nrow) == 12] 
lapply(split_swiss_2, function(x) regsubsets(Fertility ~., data=x, nvmax=10, method="forward"))