【问题标题】:loops in R - regressionR中的循环 - 回归
【发布时间】:2016-05-13 17:55:29
【问题描述】:

我刚开始使用 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函数怎么做,但是我不知道如何使用这个函数为每个公司每年运行这个函数并得到我需要的结果。
  • ?lm 看看subset =
  • 我会使用dplyr、something like this。
  • 使用 nlme 包中的 lmList 函数。

标签: r statistics


【解决方案1】:

你可以使用循环和子集来做到这一点,但你也可以使用 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)

【讨论】:

    【解决方案2】:

    使用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")
    

    【讨论】:

      【解决方案3】:

      您可以循环访问每个Firm 和Year,为每个lm 创建一个独特的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,]))
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多