【问题标题】:Creating a loop for linear regression in R and print the coefficient in extra column (price elasticity)在 R 中创建线性回归循环并在额外列中打印系数(价格弹性)
【发布时间】:2018-10-15 00:25:04
【问题描述】:

到目前为止,我们对 R 的经验很少,需要创建一个循环。我们有一个数据集,其中包含 150 多个品牌的销量和相应的价格。我们需要对每个品牌进行回归(以计算 150 种不同的价格弹性)。因为我们不想将每个品牌的每个 lm 函数都输入到我们的 R 脚本中,所以我们希望使用一个循环来或多或少地为每个品牌自动创建回归函数。此外,我们需要将价格系数(即价格弹性)放入数据框的另一列(以绘制价格弹性)。 我们曾想过使用 for() 循环函数,但这不起作用。我们可能在这个函数的规范中犯了一个错误,因为它只计算了所有品牌的一个价格弹性。 你有什么想法吗?我们期待得到任何帮助:)

这是我们线性回归的代码:

在这里,我们为“百威”品牌创建了一个数据框:

bud_all <- subset(brandlevel, brand=="Budweiser")    

在这里,我们运行回归,log_move 是“百威”的销量,log_price 是已售商品的价格:

reg_bud <-lm(log_move ~ log_price + as.factor(store), data = bud_all)     

这是我们从中得到系数的情况:

summary(reg_bud)    

这是我们第一次尝试使用 for 循环,不幸的是,所有品牌的价格弹性只有一个:

out <- data.frame(NULL)
for (i in 1:brandlevel$brand){
  m <- summary(lm(log_move ~ log_price, data=brandlevel))
  out[i,1] <- m$coefficients[2,1]
}    

【问题讨论】:

  • 你一遍又一遍地拟合同一个模型。

标签: r loops for-loop linear-regression coefficients


【解决方案1】:

您可以使用以下代码来拟合多个模型并获取它们的系数。
代替内置数据集iris 及其列SpeciesSepal.lengthPetal.length,使用brandlevel 及其列brandlog_movelog_price

data(iris)

out <- lapply(unique(iris$Species), function(s){
            sub_iris <- subset(iris, Species == s)
            m <- lm(Petal.Length ~ Sepal.Length, data = sub_iris)
            coef(m)
        })

out <- do.call(rbind, out)
out
#     (Intercept) Sepal.Length
#[1,]   0.8030518    0.1316317
#[2,]   0.1851155    0.6864698
#[3,]   0.6104680    0.7500808

编辑。

使用您的数据集和回归模型 (lm instrucion),您可以执行以下操作。 (未经测试。)

out <- lapply(unique(brandlevel$brand), function(b){
            sub_df <- subset(brandlevel, brand == b)
            m <- lm(log_move ~ log_price, data = sub_df)
            coef(m)
        })

out <- do.call(rbind, out)

两个音符。

  • 这与上面的iris 示例的逻辑完全相同。
  • 您不需要调用复杂的summary 函数。有函数可以提取lm的返回值的系数和其他成员。

【讨论】:

  • 非常感谢您的回答!我尝试了您的代码,但 R 计算了 1 个多小时。我不确定 function(s) 和 species = s 是什么意思。您的意思是(对于我们的数据)为 s 输入品牌名称吗?以下代码是我尝试过的:out &lt;- lapply(unique(brandlevel$log_move), function(s){ sub_brandlevel &lt;- subset(brandlevel, brand = s) m &lt;- lm(log_move ~ log_price, data = sub_brandlevel) coef(m) }) out &lt;- do.call(rbind, out) out
  • 对不起,我尝试的代码是out &lt;- lapply(unique(brandlevel$brand), function(s) {etc。
  • @Anna 您之前评论中的代码似乎是错误的,因为您在应该为unique(brandlevel$brand) 时执行了unique(brandlevel$log_move)
  • 非常感谢,代码有效,我们得到了输出!一个问题仍然存在:每个品牌都有相同的系数(如您的示例中)-您知道问题是什么或如何解决它吗?
  • 我的输出如下所示:(Intercept) log_price [1,] 0.658253 -2.028101 [2,] 0.658253 -2.028101 [3,] 0.658253 -2.028101 [4,] 0.658253 -2.028101 [5,] 0.658253 -2.028101 etc.
猜你喜欢
  • 2023-03-11
  • 2021-07-02
  • 2019-01-02
  • 2020-07-16
  • 2016-05-21
  • 2022-01-22
  • 2017-05-05
  • 2015-03-13
  • 2016-04-15
相关资源
最近更新 更多