2016-11-27 78 views
-1

整个数据包括5列,分别命名为A,B,C,D和投资组合。我将运行每个投资组合的线性回归模型。因此,整个数据被分为子集数据。然后,运行回归模型并检查其总结。 数据帧类似于下表,如何通过使用循环函数获得简明代码

 A B C D Portfolio 
1   ...    11 
2   ...    22 
3   ...    13 
4   ...    11 
5   ...    21 
6   ...    21 
7   ...    23 
8   ...    12 
9   ...    11 
10   ...    12 
11   ...    22 
...      

我确实呈现如下的代码,

Portfolio_11<-subset(df, Portfolio==11) 
Portfolio_12<-subset(df, Portfolio==12) 
Portfolio_13<-subset(df, Portfolio==13) 
Portfolio_21<-subset(df, Portfolio==21) 
Portfolio_22<-subset(df, Portfolio==22) 
Portfolio_23<-subset(df, Portfolio==23) 

Reg_11<-lm(A ~ B + C + D, data=Portfolio_11) 
Reg_12<-lm(A ~ B + C + D, data=Portfolio_12) 
Reg_13<-lm(A ~ B + C + D, data=Portfolio_13) 
Reg_21<-lm(A ~ B + C + D, data=Portfolio_21) 
Reg_22<-lm(A ~ B + C + D, data=Portfolio_22) 
Reg_23<-lm(A ~ B + C + D, data=Portfolio_23) 

summary(Reg_11) 
summary(Reg_12) 
summary(Reg_13) 
summary(Reg_21) 
summary(Reg_22) 
summary(Reg_23) 

我尝试通过使用循环函数来简化R代码里面。像,

for (i=1:3, j=1:3){ 
Portfolio_ij<-subset(df, Portfolio==ij) 
Reg_ij<-lm(A ~ B + C + D, data=Portfolio_ij) 
summary(Reg_ij) 
} 

但是,我是一个在r的启动,并不真正了解循环功能的规则。所以我想学习它。非常感谢。

+0

可以请你把它变成一个[可重现的例子](http:// stackoverflow。com/questions/5963269/how-to-make-a-great-r-reproducible-example?rq = 1)? –

回答

2

我们可以通过函数

library(data.table) 
dtSummary <- setDT(df)[, list(list(summary(lm(A ~ B + C + D)))), by = Portfolio] 
dtSummary$V1 
0

使用基础R使用该组中的一个,你可以尝试:

#creates your combinations 
subs <- apply(expand.grid(1:3, 1:2), 1, function(x) as.numeric(paste0(x, collapse=""))) 
# loop along these combinations. Note the print. 
for (i in subs) 
    print(summary(lm(A ~ B + C + D, data=subset(df, Portfolio==i)))) 

但由于要求在评论,重复的例子会有所帮助。

这里有一个内置的数据集:

# same as above 
subs <- apply(expand.grid(1:3, 1:2), 1, function(x) as.numeric(paste0(x, collapse=""))) 

# here we create the dataset  
n=50 # we want 50 rows 
set.seed(1) # for the sake of reproducibility 
df <- data.frame(A=rnorm(n), B=rnorm(n), C=rnorm(n), D=rnorm(n), Portfolio=sample(subs, n, replace=TRUE)) 

# now we can apply the loop: 
for (i in subs){ 
    cat(rep("*", 20), "\nlm for Portfolio =", i, '\n') # a cheap console displayer 
    print(summary(lm(A ~ B + C + D, data=subset(df, Portfolio==i)))) 
} 

但作为人回答了这两个data.tabledplyr包导致更简单/通用语法相比,基地R.

1

为了让自己的生活更轻松,使用其中一个R软件包进行数据管理。 Akrun已经提到data.table;这也是一个典型的用例dplyr的do

library(dplyr) 
df %>% 
    group_by(Portfolio) %>% 
    do(smry=summary(lm(A ~ B + C + D, data=.))) 
1

这是拆分申请-结合的方法的经典案例,或者至少拆分申请的一部分,因为它不知道你要怎么办与输出。这里有一个办法做到这一点的基础R,返回列表中的结果称为Summaries

Summaries <- lapply(split(df, df$Portfolio), function(i) summary(lm(A ~ B + C + D, data = i))) 

从里面工作了,你:

  1. 使用split打破了原有的数据到一个列表由期望的子集组成,这些子集在此由唯一值DF$Portfolio定义。
  2. 使用lapply超过列表的在步骤1中

结果创建的元素迭代建模和模型总结功能是一个列表(Summaries),第i个元素,其中对应于第i个子集df$Portfolio。方便的是,列表元素将具有与df$Portfolio的唯一值相对应的名称,例如,您可以使用Summaries[["21"]]来检查它们。或者,如果您只想在终端或降价中查看结果,请删除Summaries <-部分。