这不是一个完整的答案,而是一个开始。
首先,我认为将数据集拆分为不同的对象是错误的。这只会让它更难处理。更好的是在您的数据框中添加一个指标变量,例如
> 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
我的第二个技巧是使用 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 包中的某些东西。您甚至可以将其作为一个大模型拟合,变量和十年之间存在交互作用(与您的 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 包可能会给你一些优雅的方式来拟合模型,避免轻敲。您如何进行将部分取决于您希望如何存储模型结果 - 您想要整个模型,还是只是每个模型的汇总统计等等。
如果有必要,我不会害怕在某些时候使用循环。在 R 中,循环几乎总是一个坏主意,因为它在向量中一次做一个元素,但使用它们一次做一个模型对于代码的读者来说有时比更深奥的操作更透明。当数据以数千行而不是数百万行计算时,操作速度不会成为问题(例如,您的数据集实际上非常小),因此代码的透明度和易于检查成为选择编程的真正标准方法。