【问题标题】:Regression Loop by category按类别回归循环
【发布时间】:2015-12-06 20:48:40
【问题描述】:

我有一个包含多个引擎的数据集,我想创建一个 for 循环函数来为每个引擎运行线性回归并提取每个回归的系数。因此,我希望第一次回归使用 engine=Google 运行六周,然后第二次使用engine=Bing 运行六周等。数据集的示例如下所示:

Engine  Wk   Imp   Clicks  lnSpend  Actions CPA
google  1   100302  15791   10998    31     354.79
google  2   23893   4734    2866     16     179.18
google  3   318       16    37.83    11     3.44
google  4   7992    1980    1704.81  27     63.14
google  5   13206   3292    2732.13  26     105.08
google  6   10888   2966    2293.86  22     104.27
bing    1   23536   1808    1028.95  3      342.98
bing    2   86873   7196    2740.28  14     195.73
bing    3   54654   4398    1786.96  13     137.46
bing    4   45553   3353    1860.47  13     143.11
bing    5   41254   3322    1811.80  13     139.37
bing    6   38305   3117    1501.01  19     79.00

回归方程为actions~ spend,这将在所有引擎中保持不变。

这是我目前的代码:

for(i in unique(mydata$engine)) 
  {
  reg<- append(reg, lm(mydata$Actions~ mydata$lnspend, data=mydata[mydata$engine== i,]))
}
summary(reg)

但是,当我这样做时,回归会在将所有引擎组合在一起的完整数据集上运行。

我也尝试过使用 by 函数。我的代码是

reg<- by(mydata$engine, function(mydata) lm(Actions~ lnspend, data=mydata))
sapply(reg, coef)

运行时出现以下错误:

“unique.default(x, nmax = nmax) 中的错误”

知道怎么解决吗?

【问题讨论】:

  • 你可以试试lapply(split(df, df$Engine), function(x) coef(lm(Actions ~ lnSpend, data = x))) in base R
  • 是的,这行得通,谢谢!你知道我如何提取每个回归的系数吗?通常,当我提取系数时,我会执行“constc

标签: r for-loop foreach linear-regression


【解决方案1】:

使用data.table

library(data.table)
mydata=data.table(mydata)
mydata[,as.list(lm(Actions~lnSpend)$coeff),by=Engine]

    Engine (Intercept)     lnSpend
1: google   17.632263 0.001318611
2:   bing    4.735979 0.004341699

【讨论】:

  • 我尝试安装包“data.frame”但我收到错误,它不适用于 R 版本 3.2.0。是否有任何其他软件包可以将回归中的系数提取到表格中?
  • 它应该是“data.table”,而不是“data.frame”。它仅用于分组,您也可以在 {dplyr} 或 base R 中进行分组
【解决方案2】:

您也可以通过稍微调整您的第一个 for 循环来使其工作:

Engine <- c('g','g','g','g','g','g','b','b','b','b','b','b')
Actions <- c(31,16,11,27,26,22,3,14,13,13,13,19)
lnSpend <- c(10998,2866,37.83,1704.81,2732,2293,1028,2740,1786,1860,1811,1501)
df <- data.frame(Engine,Actions,lnSpend)
reg <- c()
for (eng in unique(Engine)){
  m <- lm(Actions~ lnSpend, data = df[which(df$Engine == eng),])
  reg <- append(reg, m$coeff)
}
reg
# > reg
# (Intercept)      lnSpend  (Intercept)      lnSpend 
# 17.632629162  0.001318568  4.734059476  0.004344177 

【讨论】:

  • 当我根据您的代码调整循环时,它仍然将所有引擎组合在一起并且只运行一个回归。
  • 我刚刚对其进行了编辑,使其仅提取系数。我相信原始版本有效,但两个 lm 结果只是粘贴在一起。
【解决方案3】:

你的 for/loop 应该可以工作。您只是没有按引擎类型过滤 for/loop 中的因变量和自变量,因此 R 采用了完整的数据集:

考虑在每个变量中显式引用子集过滤器:

for(i in unique(mydata$engine)) 
  {
  reg<- append(reg, lm(mydata$Actions[mydata$engine== i] ~ mydata$lnspend[mydata$engine== i],
               data=mydata[mydata$engine== i,]))
}

或者匿名离开,以便数据参数决定结构:

for(i in unique(mydata$engine)) 
  {
  reg<- append(reg, lm(Actions ~ lnspend,
               data=mydata[mydata$engine== i,]))
}
summary(reg)

【讨论】:

    猜你喜欢
    • 2013-03-26
    • 2021-10-17
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2016-01-17
    相关资源
    最近更新 更多