【问题标题】:Using data.table to create a column of regression coefficients使用 data.table 创建一列回归系数
【发布时间】:2012-12-16 21:51:48
【问题描述】:

我正在努力解决这似乎应该是我之前问过 here 的问题的简单扩展。

我正在尝试汇总 (a) 日期范围和 (b) 因子变量。样本数据可能是:

Brand    Day     Rev     RVP              
  A      1        2535.00  195.00 
  B      1        1785.45  43.55 
  C      1        1730.87  32.66 
  A      2        920.00   230.00
  B      2        248.22   48.99 
  C      3        16466.00 189.00      
  A      1        2535.00  195.00 
  B      3        1785.45  43.55 
  C      3        1730.87  32.66 
  A      4        920.00   230.00
  B      5        248.22   48.99 
  C      4        16466.00 189.00

感谢有用的建议,我知道如何使用 data.table 找到品牌在几天内的平均收入:

new_df<-df[,(mean(Rev)), by=list(Brand,Day)]

现在,我想创建一个新表,其中有一列列出了每个品牌的 Rev by Day 的 OLS 回归的系数估计值。我尝试这样做:

new_df2<-df[,(lm(Rev~Day)), by=list(Brand)]

这似乎不太正确。想法?我敢肯定,我错过了一些明显的东西。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    你有几个选择。

    您可以将整个模型对象保存为 data.table 中的列表

    models <- df[,   list(model  = list(lm(Rev ~ Day))),by = Brand]
    
    models
       Brand model
    1:     A  <lm>
    2:     B  <lm>
    3:     C  <lm>
    
    
    # look at the models
    models[,print(model[[1]]),by= Brand]
    
    
    Call:
    lm(formula = Rev ~ Day)
    
    Coefficients:
    (Intercept)          Day  
         2804.2       -538.3  
    
    
    
    Call:
    lm(formula = Rev ~ Day)
    
    Coefficients:
    (Intercept)          Day  
         1741.5       -263.5  
    
    
    
    Call:
    lm(formula = Rev ~ Day)
    
    Coefficients:
    (Intercept)          Day  
          -3698         4653  
    

    你可以保存系数

    models[, {coefs <- coef(model[[1]])
          list(coefs = coefs, name = names(coefs))}, by = Brand]
    ##     Brand      coefs        name
    ## 1:     A  2804.1667 (Intercept)
    ## 2:     A  -538.3333         Day
    ## 3:     B  1741.5291 (Intercept)
    ## 4:     B  -263.5251         Day
    ## 5:     C -3697.8621 (Intercept)
    ## 6:     C  4653.1989         Day
    

    或者你可以只提取模型列表

      models[,model]
    

    【讨论】:

    • 嗨!快速附录...如何在两个计算中创建两列?
    【解决方案2】:

    我想这就是你想要的:

    new_df2<-df[,(lm(Rev~Day)$coefficients[["Day"]]), by=list(Brand)]
    

    lm 返回一个完整的模型对象,您需要深入了解它以从每个组中获取一个可以变成一列的值。

    【讨论】:

    • 嗨!快速附录...如何使用两个计算制作两列?哎呀!
    【解决方案3】:
    > DF <- read.table(text="Brand    Day     Rev     RVP              
    +   A      1        2535.00  195.00 
    +   B      1        1785.45  43.55 
    +   C      1        1730.87  32.66 
    +   A      2        920.00   230.00
    +   B      2        248.22   48.99 
    +   C      3        16466.00 189.00      
    +   A      1        2535.00  195.00 
    +   B      3        1785.45  43.55 
    +   C      3        1730.87  32.66 
    +   A      4        920.00   230.00
    +   B      5        248.22   48.99 
    +   C      4        16466.00 189.00", header=TRUE)
    > DT <- data.table(DF)
    > Mod.tbl<-DT[, list(mod=list(lm(Rev~Day))), by=list(Brand)]
    > Mod.tbl[ , coef(mod[[1]])["Day"], by= Brand]
       Brand           V1
    1:     A -538.3333333
    2:     B -263.5251429
    3:     C 4653.1989474
    

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多