2012-01-26 17 views
2

私はいくつかの変数を持つ大きなデータセットを持っています。その1つは状態変数で、各状態ごとに1〜50コードされています。私はデータセットの残りの27の変数(合計55の変数があります)に28変数の回帰を実行したいと思います。それぞれの状態に固有のものです。R回帰回帰からlapplyコマンドを使用して回帰係数を抽出する

つまり、state == 1の観測に対して、covariate1、covariate2、...、covariate27でvariable1の回帰を実行します。私は次に、状態2〜50のvariable1に対してこれを繰り返し、variable2、variable3、...、variable28のプロセス全体を繰り返します。

私はこれを行うために正しいRコードを書いたと思いますが、次は、係数行列を理想的には係数行列に抽出することです。誰かがこれで私を助けてくれますか?私は少しあなたのコードをクリーンアップしました

for (num in 1:50) { 

    #PUF is the data set I'm using 

    #Subset the data by states 
    PUFnum <- subset(PUF, state==num) 

    #Attach data set with state specific data 
    attach(PUFnum) 

    #Run our prediction regression 
    #the variables class1 through e19700 are the 27 covariates I want to use 
    regression <- lapply(PUFnum, function(z) lm(z ~ class1+class2+class3+class4+class5+class6+class7+ 
                xtot+e00200+e00300+e00600+e00900+e01000+p04470+e04800+ 
                e09600+e07180+e07220+e07260+e06500+e10300+ 
                e59720+e11900+e18425+e18450+e18500+e19700)) 

    Beta <- lapply(regression, function(d) d<- coef(regression$d)) 


    detach(PUFnum) 
} 

答えて

1

を::

fm <- z ~ class1+class2+class3+class4+class5+class6+class7+ 
      xtot+e00200+e00300+e00600+e00900+e01000+p04470+e04800+ 
      e09600+e07180+e07220+e07260+e06500+e10300+ 
      e59720+e11900+e18425+e18450+e18500+e19700 

PUFsplit <- split(PUF, PUF$state) 
mod <- lapply(PUFsplit, function(z) lm(fm, data=z)) 

Beta <- sapply(mod, coef) 

あなたが望んでいた場合、あなたもすべて1行でこれを置くことができます:

ここで私はこれまでに書いたコードです
Beta <- sapply(lapply(split(PUF, PUF$state), function(z) lm(fm, data=z)), coef) 
5

これは古典的なSplit-Apply-Combineのもう1つの例です。これは、@hadleyのplyrパッケージを使用して解決できます。あなたの問題では、状態

  • によって

    1. 分割データフレームにしたいデータフレームに係数を組み合わせて、各サブセット
    2. のための回帰を適用します。

    Cars93データセットをMASSライブラリで使用して説明します。国のoriginに基づいてhorsepowerenginesizeの関係を把握することに関心があります。

    # LOAD LIBRARIES 
    require(MASS); require(plyr) 
    
    # SPLIT-APPLY-COMBINE 
    regressions <- dlply(Cars93, .(Origin), lm, formula = Horsepower ~ EngineSize) 
    coefs <- ldply(regressions, coef) 
    
        Origin (Intercept) EngineSize 
    1  USA 33.13666 37.29919 
    2 non-USA 15.68747 55.39211 
    

    EDIT。たとえば、Cars93PUFOriginstate、式は

    を入力してください。