これは完全な答えではありませんが、開始です。
まず、データ セットを異なるオブジェクトに分割するのは間違いだと思います。これだけで扱いが難しくなります。より良いのは、データフレームにインジケーター変数を追加することです。
> 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 つのモデルで処理を行うことは、より難解な操作よりもコードの読者にとって透過的である場合があります。データが数百万行ではなく数千行でカウントされる場合、操作の速度は問題になりません (たとえば、ここでのデータセットは実際にはかなり小さいです)。そのため、コードの透明性とチェックの容易さが、プログラミングを選択する際の実際の基準になります。アプローチ。