0

我有一个大型数据框,其中包含包括美国在内的 7 个不同国家(列)从 1970 年 1 月到 2009 年 12 月(行)的月度股票收益。我的任务是使用 4 个不同时间段(即 70 年代、80 年代、90 年代和 00 年代)的值对每个国家的股票收益(因变量)回归美国股票收益(自变量)。

数据集 (.csv) 可在以下网址下载: https ://docs.google.com/file/d/0BxaWFk-EO7tjbG43Yl9iQVlvazQ/edit

这意味着我有 24 个回归要单独运行并报告结果,我已经使用该lm()函数完成了这些。但是,我目前正在尝试更智能地使用 R 并创建自定义函数来实现我的目的并产生 24 组结果。

我创建了子数据框,其中包含根据知道十年中有 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)

注意:每个新创建的变量都是 120 x 7 矩阵,用于 7 个国家/地区的 120 次观察。

使用 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

我的第二个技巧是使用 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 中,循环几乎总是一个坏主意,因为它在向量中一次做一个元素,但使用它们一次做一个模型对于代码的读者来说有时比更深奥的操作更透明。当数据以数千行而不是数百万行计算时,操作速度不会成为问题(例如,您的数据集实际上非常小),因此代码的透明度和易于检查成为选择编程的真正标准方法。

于 2013-01-29T21:05:08.687 回答