2012-12-16 3 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)] 

, I 각 브랜드에 대해 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

안녕하세요. 빠른 부록 ... 어떻게 계산 두 열을 만들 수 있습니까? 어! – roody

+0

@DWin의 [이 답변보기] (http://stackoverflow.com/a/11267149/1344789) ... – dnlbrky

3

몇 가지 옵션이 있습니다.

귀하는 계수

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 

을 절약 할 수 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[,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