我有一个大型数据框,包含1970年1月至2009年12月(行)的月度股票回报,包括美国在内的7个不同国家(列)。我的任务是使用4个不同时间段的值,即70s,80s,90s和00s,对美国股票收益(自变量)的每个国家的股票收益(因变量)进行回归。
数据集(.csv)可以在以下位置下载: https://docs.google.com/file/d/0BxaWFk-EO7tjbG43Yl9iQVlvazQ/edit
这意味着我有24个回归分开运行并报告结果,我已经使用lm()
函数完成了。但是,我目前正在尝试使用R smarter并创建自定义函数,以实现我的目的并产生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
函数。
谢谢你,如果我的帖子需要进行一些编辑,请告诉我。
答案 0 :(得分: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包可能会给你一些优雅的方法来拟合模型,避免使用tapply。如何进行将部分取决于您希望如何存储模型结果 - 您想要整个模型,还是只需要每个模型的摘要统计数据等。
如果有必要,我不会害怕在某些时候使用循环。在R中,循环几乎总是一个坏主意,因为在向量中一次执行一个元素,但是使用它们一次做一个模型对于代码的读者来说有时比更深奥的操作更透明。当数据以数千行而非数百万计数时,操作速度不会成为问题(例如,您的数据集实际上非常小),因此代码的透明度和检查的简便性成为选择编程的真正标准方法