0

米国を含む 7 つの異なる国 (列) の 1970 年 1 月から 2009 年 12 月 (行) までの月次株式収益を含むメガ データ フレームがあります。私の仕事は、70 年代、80 年代、90 年代、00 年代の 4 つの異なる期間の値を使用して、米国の株式リターン (独立変数) で各国の株式リターン (従属変数) を回帰することです。

データ セット (.csv) は、 https ://docs.google.com/file/d/0BxaWFk-EO7tjbG43Yl9iQVlvazQ/edit からダウンロードできます 。

これは、個別に実行して結果を報告する 24 の回帰があることを意味します。これは、lm()関数を使用して既に行っています。ただし、現在、R をよりスマートに使用し、目的を達成して 24 セットの結果を生成するカスタム関数を作成しようとしています。

10 年に 120 か月あることを知っている期間に従ってクラスター化された観測を含むサブ データ フレームを作成しました。

seventies = mydata[1:120, ] # 1970s (from Jan. 1970 to Dec. 1979)
eighties = mydata[121:240, ] # 1980s (from Jan. 1980to Dec. 1989)
nineties = mydata[241:360, ] # 1990s (from Jan. 1990 to Dec. 1999)
twenties = mydata[361:480, ] # 2000s (from Jan. 2000 to Dec. 2009)

注: 新しく作成された各変数は、7 か国にわたる 120 の観測値の 120 x 7 行列です。

Java を使用して 24 回の回帰を実行するには、複雑なforループを使用する必要があります。

目的の結果に到達する関数を作成するために必要な手順を誰かが提供できますか? R コードの一部のスニペットも歓迎します。mapply機能を利用することも考えています。

ありがとうございます。私の投稿に編集が必要な場合はお知らせください。

4

1 に答える 1

1

これは完全な答えではありませんが、開始です。

まず、データ セットを異なるオブジェクトに分割するのは間違いだと思います。これだけで扱いが難しくなります。より良いのは、データフレームにインジケーター変数を追加することです。

> mydata <- as.data.frame(matrix(round(rnorm(480*7),1), ncol=7))
> names(mydata) <- c("USA", paste("country", 1:6, sep=""))
> 
> mydata$decade <- rep(c("seventies", "eighties", "nineties", "twenties"), rep(120,4))
> 
> head(mydata)
   USA country1 country2 country3 country4 country5 country6    decade
1  0.2     -0.1      0.8      0.9     -1.6     -0.1     -1.1 seventies
2  0.0     -0.5      0.1     -0.4     -1.2     -0.9      1.3 seventies
3  2.2      1.4      1.7      1.0     -1.6     -1.5      0.6 seventies
4 -0.5      2.5      0.2     -0.9      2.3      1.0      0.1 seventies
5 -0.1      0.0     -0.9     -1.4      0.7     -0.1     -0.1 seventies
6  0.3     -0.4      0.1      0.5      0.2      0.9     -0.5 seventies

私の 2 番目のヒントは、たとえば reshape または reshape2 ライブラリを使用して、これを長い形式に変換することです。

> library(reshape2)
> mydata.m <- melt(mydata, id.vars=c("USA", "decade"))
> head(mydata.m)
   USA    decade variable value
1  0.2 seventies country1  -0.1
2  0.0 seventies country1  -0.5
3  2.2 seventies country1   1.4
4 -0.5 seventies country1   2.5
5 -0.1 seventies country1   0.0
6  0.3 seventies country1  -0.4

ここから、さまざまなオプションがあります。base の tapply() か、plyr パッケージの何かを使用できます。変数と 10 年間の相互作用を使用して、1 つの大きなモデルとして適合させることもできます (残差分散の個別の推定を可能にする 24 のモデルと同様の結果が得られますが、同一ではありません)。たとえば、tapply を使用して開始するには:

> country <- with(mydata.m, tapply(USA, list(decade, variable), function(x){x}))
> country
          country1    country2    country3    country4    country5    country6   
eighties  Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
nineties  Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
seventies Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
twenties  Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
> country[1,1]
[[1]]
  [1]  0.2  1.1  0.2  0.1 -0.1  2.1 -2.4 -0.5 -0.5 -0.3  0.1 -0.9 -0.6 -0.1  0.8  0.9  0.4  0.6 -0.5  0.4
 [21] -1.3  0.9  0.0 -1.0  0.2 -0.2  0.0 -0.5  0.0  1.4  0.7 -0.9 -1.1  1.7  0.5 -1.0  1.1  0.1  0.3  0.8
 [41] -0.5 -1.9 -1.5 -0.2  0.5 -0.8 -1.2  1.0  0.3  1.7 -0.5  1.2 -0.1  0.9  0.9  0.5 -1.8  0.7  0.1  0.7
 [61]  0.4  0.2 -0.7  2.1  0.2 -1.1 -1.4  1.7 -0.4 -1.0  0.0  1.0 -0.6  1.5  0.4  0.3 -0.2 -1.0 -0.8  1.0
 [81]  0.4 -0.3  1.2  0.9 -0.8  0.2 -0.7 -1.3  0.4 -0.7  0.7  1.5 -0.7 -0.3 -2.3  0.3  0.6 -0.9 -0.5  0.4
[101]  0.4 -0.8  0.2  0.2  0.3 -1.0 -1.0  0.6 -2.8 -0.2  2.7  1.1 -0.5 -0.1 -0.6 -0.6 -0.2  0.1  0.0 -0.9

等々。plyr パッケージは、おそらくタップを回避するモデルを適合させるエレガントな方法を提供します。どのように進めるかは、モデルの結果をどのように保存するかによって部分的に異なります。モデル全体が必要なのか、それともモデルごとの要約統計が必要なのかなどです。

必要に応じて、ある時点でループを使用することを恐れません。ベクトルで一度に 1 つの要素を処理する場合、R でループを使用することはほとんど常に悪い考えですが、ループを使用して一度に 1 つのモデルで処理を行うことは、より難解な操作よりもコードの読者にとって透過的である場合があります。データが数百万行ではなく数千行でカウントされる場合、操作の速度は問題になりません (たとえば、ここでのデータセットは実際にはかなり小さいです)。そのため、コードの透明性とチェックの容易さが、プログラミングを選択する際の実際の基準になります。アプローチ。

于 2013-01-29T21:05:08.687 に答える