2013-09-21 36 views
1

我想爲不同的國家(即我的數據的子集)運行相同的迴歸。我沒弄清楚如何R中做,但在Stata更加輕鬆做同樣的事情後,我不知道是否有在R.一個更好的辦法R中某個子集上的迴歸

在Stata你會做這樣的事情:

foreach country in USA UK France { 
    reg y x1 x2 if country == "`country'" 
} 

簡單易讀,對吧?在R中,我提出了split和ddply方法,兩者都比較複雜。要使用split

data.subset <- split(data, data$country)[c("USA", "UK", "France")] 
res <- lapply(data.subset, function(subset) lm(y ~ x1 + x2, data=subset)) 

一個更緊湊的代碼將使用ddply。但在這種情況下,該模型將針對所有國家運行。我可以選擇幾個嗎?

ddply(data, "country", function(df) coefficients(lm(Y~X1+X2, data=df))) 

但是,我有興趣知道是否有像Stata這樣的直觀可讀的循環?

回答

4

有幾種選擇:

一個使用ddply方式:

ddply(data[ data$country %in% c('USA','UK','France'), ], "country", function(df) coefficients(lm(Y~X1+X2, data=df))) 

使用lapply(或sapply)以不同的方式:

lapply(c("USA","UK","France"), function(curcont) lm(y ~ x1+x2, data=data, subset= country==curcont)) 

你可以使用從該lmList功能nlme包。

你可以直接使用LM(雖然這將使用方差的彙總估計,而不是單獨的):

lm(y ~ 0 + factor(country) * (x1 + x2), data=data, subset= country %in% c('USA','UK','France')) 

也有by功能和for循環和可能其他選擇。

+0

哇 - 你的第二段代碼中'lm'的'subset'選項是我正在尋找的。很好的答案! – Heisenberg