2016-05-16 45 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,如果它回答您的问题/解决您的问题,请点击复选标记 –