2016-07-06 15 views
0

私は12の予測子のデータフレームと、BEI(私が予測したい)という数のリストを持っています。私は、データの12行ごとに段階的な選択を実行したいと思います。たとえば、1:12、2:13などです。各ローリングについて、係数を返し、係数を使用してBEIを予測します。以下は私のコードです:R段階の回帰回帰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) 
} 

と私はこのようなエラーを得た: 並べ替え変数をして、再度試みる:50件の以上の警告があった (使用上の警告()最初の50を参照する)

警告: 1:in leaps.setup(x、y、wt = wt、nbest = nbest、nvmax = nvmax、...: 1つのリニア依存関係が見つかりました 2:leaps.setup(x、y、wt = nbsp; nbest = nbest、nvmax = nvmax、...: 1つのリニア依存関係が見つかった leaps.setup(x、y、wt = wt、nbest = nbest、nvmax = nvmax、...: 1つの線形の依存関係が見つかりました ....など

これを修正するにはどうすればよいですか?それともコードを書くより良い方法ですか?

答えて

0

エラーが発生する理由は、データサブセットをローリングするための値(NA)がないためです。一例として

使用してデータ(スイス):あなたが例よりも予測因子であるこれらのdata.framesとregsubsetsを実行した場合

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 

エラーが続くでしょう。

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 
...... 

その代わりに、私は12行のみのサブセットを保持し、ように後退を続けることができる。

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