语法:循环回归具有不同的子集

时间:2014-07-13 14:09:15

标签: r loops

我试图通过使用具有相同时间间隔(5年)但在不同年份内的不同子集来执行汇总回归。我的代码语法有问题,我似乎对子集的定义做错了。

> head(Grunfeld)
  firm year   inv  value capital
1    1 1935 317.6 3078.5     2.8
2    1 1936 391.8 4661.7    52.6
3    1 1937 410.6 5387.1   156.9
4    1 1938 257.7 2792.2   209.2
5    1 1939 330.8 4313.2   203.4
6    1 1940 461.2 4643.9   207.2




library(plm)
data("Grunfeld", package="plm")

#regression
myregression <- list()
Grunfeld_sub <- data.frame()
count <- 1

#loop
for(t in 1940:1950){

Grunfeld_sub[t] <- subset(Grunfeld, year<=t & year>=t-5)
myregression[[count]] <- lm(inv~value + capital, Grunfeld_sub(t))

count<- count+1
}

我在语法上做错了什么?如何正确定义子样本?

另一个问题是,如果我想使用plm包并使用plm.data函数转换我的data.frame(Grunfeld),我将无法再使用子集,因为我有点不能将它与factorvariables一起使用(时间变量将成为一个因素变量)是否有可能解决这个问题? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您的代码正在尝试将Grunfeld的整个子集存储在Grunfeld_sub的一列中,这会导致错误。您实际上并不需要存储先前循环中的子集,因为您只在循环的当前迭代中使用当前版本的Grunfeld_sub。您也不需要单独的count变量。这是您的代码的重新修改:

# Store each subset regression in myregression
myregression <- list()

# Regression on six-year subsets of Grunfeld
for(t in 1940:1950) {

  myregression[[t-1939]] <- lm(inv ~ value + capital, 
                              subset(Grunfeld, year<=t & year>=t-5))

  # Rename list elements by year range of subset
  names(myregression)[[t-1939]] = paste0("Years:",t-5,"-",t)
}

以下是myregression

中存储的前两个回归
> myregression
$`Years:1935-1940`

Call:
lm(formula = inv ~ value + capital, data = Grunfeld_sub)

Coefficients:
(Intercept)        value      capital  
   -3.65240      0.08283      0.11033  


$`Years:1936-1941`

Call:
lm(formula = inv ~ value + capital, data = Grunfeld_sub)

Coefficients:
(Intercept)        value      capital  
  -13.77258      0.08614      0.18680  

有关更详细的输出,请lapply(myregression, summary)

要运行plm功能,您是否只能直接使用Grunfeld数据并向index提供相应的plm参数?例如:

for(t in 1940:1950) {

  myregression[[t-1939]] <- plm(inv ~ value + capital, 
                                data=subset(Grunfeld, year<=t & year>=t-5),
                                index=c("firm","year"))
  names(myregression)[[t-1939]] = paste0("Years:",t-5,"-",t)
}