2012-11-09 16 views
5

私は96回の回帰を実行し、結果を96種類の異なるオブジェクトとして保存しようとしています。事を複雑にするために、私はモデルの共変量の1つの添え字も96回も変えたいと思っています。私はほとんど問題を解決しましたが、残念ながら壁に衝突しました。コードは、これまでのところで、回帰で共変量をループする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)) 

} 

これは、オブジェクトの作成側で動作します(たとえば、私が持っているz.out1 - z.out96を)が、私は同様に変更する共変量に添字を得るように見えることはできません。

データセットにTE_1、TE_2、TE_96という96の変数があります。したがって、TE_の下付き文字「i」は、作成する各オブジェクトに対応するように変更する必要があります。つまり、z.out1は、このモデルからの結果を保持する必要があります

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) 

をそしてz.out96は次のようになります。

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) 

うまくいけば、これは理にかなっています。私はヒント/アドバイスに感謝しています。

+0

しかし、progとは別にラミング問題がある場合は、個々の要素として時系列上のlmに関するCrossValidateを再考するか、尋ねるべきでしょう。結果は間違いであり、間違っているだけです。 –

答えて

7

私はリストに結果を入れて、for loopassign

を避けるだろうあなたの数式を作成するreformulateupdateの組み合わせを使用することができます

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) 

今では96個の要素があるはずですリストmodels

元の予定の名前を反映するように名前を付けることができます

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 = '') 

、次いで

models$z.out5 

など

によって単一のモデルにアクセスしたり、モデルの全ての要約を作成

summaries <- lapply(models, summary) 

など....

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

# the table with coefficient estimates and standard.errors 

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

ありがとう!これはトリックです。私がモデルから係数を抽出したいとしたら、forループを使うのは賢明でしょうか?例: - bumpkis < - matrix(nrow = 96、ncol = 1) for(i:1:96){ bumpkis [i、] < - c(models $ z.out(i)$ coefficients [2] ) } 私は仕事を得ることができないので、残念ながらこれは動作しません。私はループに関する何かが欠けていると思う。 – kpeyton

+0

いいえ、編集した解決策の私の例を参照してください。この種のアクティビティではループは機能しますが、慣用的なRソリューションは 'lapply'を使うことです。 'models $ z.out(i)'に 'i'を使用した場合は正しくありません。 'models [[paste( 'z.out'、i、sep = '')]]'を試してください。 '$'を使用することはできません – mnel