在R中的循环 - 回归

3
我刚开始使用R进行统计分析,仍在学习中。我在创建R循环时遇到了问题。我有以下情况,想知道是否有人能帮助我解决。对我而言,似乎是不可能的,但对于你们中的一些人来说,这只是小菜一碟。我有一个数据集,涵盖了不同公司在不同年份的情况。对于每个公司,我都有相同年份的不同观察结果,并且我需要为每个公司的每年运行以下回归(我有超过1000家公司,似乎不可能为每个公司单独运行回归): Ri = α0 + β1Rm + β2Rz + Ɛ
the data I have looks like the following example:
Year   Firm    Ri    Rm    Rz
2009   A       30    55    85
2009   A       11    55    85
2009   A       1     55    85
2010   A       7     55    85
2010   A       15    55    85
2011   A       20    55    85
2011   A       3.5   55    85
2011   A       8     55    85
2009   B       24    55    85
2009   B       30    55    85
2009   B       25    55    85
2010   B       5.2   55    85
2010   B       11.8  55    85
2011   B       78    55    85
2011   B       90    55    85
2011   B       57    55    85

我需要获取每个公司每年的B1、B2和误差项Ɛ。就像这样:

Year Firm       B1    B2    Ɛ
2009   A       0.30  0.55  0.85
2010   A       0.11  0.55  0.85
2011   A       0.1   0.55  0.85
2009   B       0.7   0.55  0.85
2010   B       0.15  0.55  0.85
2011   B       0.20  0.55  0.85

非常感谢您的帮助。


我知道如何使用lm函数,但我不知道如何对每个公司和每年运行此函数,并获得所需的结果。 - hbtf.1046
?lm 并查看 subset = - Andrew Taylor
我会使用 dplyr,类似于这个链接 - Gregor Thomas
使用 nlme 包中的 lmList 函数。 - Roland
3个回答

2
你可以使用循环和子集来实现,但也可以使用mapply,像这样。 (我制作了一个更大的数据集以便能够正确演示)。
Year <- sort(rep.int(2009:2011, 30))
Firm <- gl(n = 2, k = 15, length = 90, labels = c('A', 'B'))
dta <- data.frame(Year, Firm, Ri = rnorm(90, 5, 2), Rm = rnorm(90, 2, 1), Rz = rnorm(90, -1, 0.5))

filt <- expand.grid(unique(dta$Year), unique(dta$Firm))

op <- mapply(function(x, y) lm(Ri ~ Rm + Rz, data = dta, subset = Year == x & Firm == y), 
             filt$Var1, filt$Var2, SIMPLIFY = FALSE)

sapply(op,coef)

1
你可以循环遍历每个 FirmYear,以创建唯一的 lm,如下所示:
#Assume your data frame is named df
#Convert Firm and Year to factor variables
df$Firm <- as.factor(df$Firm)
df$Year <- as.factor(df$Year)

#Loop through each level in Firm and Year and generate lm for each
for(i in levels(df$Firm)){
  for(j in levels(df$Year)){
    assign(paste0('lm', i, j), lm(Ri~Rm+Rz, data=df[df$Firm==i & df$Y==j,]))
  }
}

1
使用 subset = 和两个 for 循环。
for(i in unique(df$Year)) {
  for(j in unique(df$Firm)) {
     print(i)
     print(j)
     print(lm(Ri ~ Rm + Rz, data = df, subset = df$Year==i & df$Firm ==j))
  }
}

根据您的新输出:
m <- data.frame(matrix(ncol = 5, nrow = length(unique(df$Year))*length(unique(df$Firm))))
l = 0
for(i in unique(df$Year)) {
  for(j in unique(df$Firm)) {
    l = l + 1
    mod<-lm(Ri ~ Rm + Rz, data = df, subset = df$Year==i & df$Firm ==j)
    m[l,] <- c(i,
               as.character(j), 
               mod$coefficients[2],
               mod$coefficients[3],
               summary(mod)$sigma)
  }
}
names(m) <- c("Year", "Firm", "B1", "B2", "e")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接