2016-11-27 7 views
-1

データ全体にA、B、C、D、Portfolioという5つの列が含まれています。各ポートフォリオの線形回帰モデルを実行します。したがって、データ全体がサブセットデータに分割されます。次に、回帰モデルを実行してサマリを確認します。 データフレームは、私はループ機能を使って、Rコードを簡素化しようと、私は以下のようにプレゼントをしたコードループ関数を使用して簡潔なコードを取得する方法

 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の初心者であり、実際にループ関数のルールを理解していません。したがって、私はそれを学びたい。どうもありがとうございます。

+0

[再現可能な例](http:// stackoverflow)に変換してください。com/questions/5963269/how-to-make-a-great-r-reproducible-example?rq = 1)? –

答えて

2

我々は基本Rを使用した機能

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

によってグループのいずれかを使用することができ、あなたが試みることができる:

#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)))) 

しかし、コメントで尋ねたとして、再現性の例が役立つだろう。

はここに1つ内蔵されたデータセットである:

# 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パッケージの1つを使用してください。 Akrunは既にdata.tableについて言及している。これはまた、dplyrのdoのための古典的なユースケースである:

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

それはあなたが何をしたいのか明確ではないのですから、これは分割適用-組み合わせるアプローチのための古典的なケースである、または少なくとも一部を分割は、適用されます出力と一緒に。

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

あなたは、内側から外の作業:

  1. を使用splitリストに元のデータを壊すためにここでは、ベースRで、リストに結果を返すことはSummariesと呼ばれていることを行うための一つの方法です固有の値であるDF$Portfolioで定義されている、目的のサブセットで構成されています。
  2. リストの要素上の機能を要約モデリングし、モデルを反復するために使用lapply結果リスト(Summaries)であるステップ1

で作成、のi番目の要素がi番目のサブセットに対応df$Portfolio。好都合なことに、リストの要素にはdf$Portfolioの一意の値に対応する名前が付いているので、たとえばSummaries[["21"]]でそれらを調べることができます。または、ターミナルやマークダウンなどで結果を確認したい場合は、Summaries <-部分を削除してください。

関連する問題