2016-05-16 111 views
1

我有一個由x和區域和通道的唯一組合組成的單個數據框。我需要使用某種循環爲每個x組合創建一個獨特的迴歸模型。循環創建迴歸模型

region channel   date   trials spend  
EMEA display  2015-01-01  62  17875.27 
APAC banner  2015-01-01  65  18140.93 

某事的

i=1 
j=1 
for r in region{ 
    for ch in channel{ 
     df1 = df[df$region == r & df$channel == ch, ] 
     model[[i,j]] = lm(trials ~ spend, data = df1) 
         j = j+1} 
       i = i+1 } 

效果如果有人也知道存儲的唯一標識符,如區域+通道,以幫助確定迴歸模型,將是非常有幫助太的一種方式。

+2

什麼你到了那裏看起來像一個很好開始;你能告訴我們它在哪裏壞了嗎?能否請您包括數據將爲我們提供一個[重複的例子(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? –

+0

使用此代碼我得到以下錯誤'中的錯誤模型[[I,J] = LM(試驗〜支出,數據= DF1):[[]]下標出界 ' – Marcus

回答

2

使用split數據分成2名柱的組合作爲列表,然後循環中運行lm - lapply用於數據的每個子集,請參閱下面的例子:

# dummy data 
set.seed(1) 
d <- data.frame(region = letters[1:2], 
       channel = LETTERS[3:6], 
       trials = runif(20), 
       spend = runif(20)) 

# split by 2 column combo 
dSplit <- split(d, paste(d$region, d$channel, sep = "_")) 

# run lm for each subset 
res <- lapply(dSplit, lm, formula = trials ~ spend) 

# check names 
names(res) 
# [1] "a_C" "a_E" "b_D" "b_F" 

# lm result for selected combo "a_C" 
res$a_C 
# Call: 
# lm(formula = trials ~ spend, data = i) 
# 
# Coefficients: 
# (Intercept)  spend 
# 0.3360  0.2444 
3

plyr溶液:

set.seed(1) 
d <- data.frame(region = letters[1:2], 
       channel = LETTERS[3:6], 
       trials = runif(20), 
       spend = runif(20)) 

使結果的列表(即,由區域和信道分割d,在與指定的公式每個塊運行lm,返回結果作爲一個列表)

library(plyr) 
res <- dlply(d,c("region","channel"), lm, 
      formula=trials~spend) 

提取係數作爲一個數據幀:

ldply(res,coef) 
## region channel (Intercept)  spend 
## 1  a  C 0.3359747 0.2444105 
## 2  a  E 0.7767959 -0.3745419 
## 3  b  D 0.7409942 -0.8084751 
## 4  b  F 1.0797439 -1.0872158 

注意,結果中有您想要的區域/信道標誌...

+0

感謝這是完美 – Marcus

+0

我欣賞反饋意見,但SO政策是爲了避免使用評論「謝謝你」;如果答案有用,建議的渠道是upvote,如果它回答您的問題/解決您的問題,請點擊複選標記 –