2012-12-16 18 views
2

我正在努力應對這個問題,它應該是我詢問here的前一個問題的簡單擴展。使用data.table創建一列迴歸係數

我試圖在(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)] 

這似乎不太正確。思考?我相信這是我錯過的東西。

回答

2

我認爲這是你想要的:

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

lm返回完整模型對象,您需要向下鑽取以獲取每個組中可以變成列的單個值。

+1

嗨!快速附錄......如何在兩個計算中製作兩列? EEP! – roody

+0

從@DWin看到[這個答案](http://stackoverflow.com/a/11267149/1344789)... – dnlbrky

3

您有幾個選項。

你可以整個模型對象保存爲列表中的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] 
+0

也感謝您的深入解釋! – roody

+1

嗨!快速附錄......如何在兩個計算中製作兩列? – roody

1
> 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