2016-11-27 80 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 <-部分。