2012-01-26 94 views
2

我有一個包含幾個變量的大型數據集,其中一個是狀態變量,每個狀態編碼爲1-50。我想在數據集的其餘27個變量(總共有55個變量)上運行28個變量的迴歸,並針對每個狀態進行特定。R通過lapply命令從多元迴歸中提取回歸係數

換句話說,對於狀態== 1的觀察值,運行協變量1,協變量2,...,協變量27的變量1的迴歸。然後,我想對狀態2-50的變量1重複此操作,並重復變量2,變量3,...,變量28的整個過程。

我想我已經寫了正確的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) 

如果你願意,你甚至可以把所有在一行:

Beta <- sapply(lapply(split(PUF, PUF$state), function(z) lm(fm, data=z)), coef) 
5

這是典型的Split-Apply-Combine問題的另一個示例,可以使用@hadley的plyr包進行解決。在你的問題,要由國家

  1. 拆分數據幀
  2. 申請回歸對於每個子集
  3. 結合係數爲數據幀。

我會用MASS庫中的Cars93數據集說明它。我們有興趣根據國家的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 

編輯。對於您的示例,請將PUF替換爲Cars93,state代替Originfm代替公式