我有一个庞大的数据框架,其中包含从1970年1月到2009年12月的7个不同国家(包括美国)的月度股票回报(行)(列)。我的任务是使用70年代、80年代、90年代和00年代这4个不同时期的值,将每个国家的股票收益(因变量)与美国股票收益(自变量)进行回归。
数据集(.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函数。
谢谢你,如果我的帖子需要编辑,请告诉我。
发布于 2013-01-30 05:05:09
这不是一个完整的答案,而是一个开始。
首先,我认为将数据集分成不同的对象是错误的。这只会让它更难处理。更好的方法是在数据框中添加一个指示器变量,例如
> 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我的第二个技巧是将其转换为长格式,使用重塑或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中,对于在向量中一次只做一个元素的事情来说,循环几乎总是一个坏主意,但是使用循环一次做一些事情,对于代码的读者来说,有时可能比更深奥的操作更透明。当数据以数千行而不是数百万行计算时,操作速度将不是问题(例如,这里的dataset实际上非常小),因此代码的透明性和检查的简易性成为选择编程方法的真正标准。
https://stackoverflow.com/questions/14596390
复制相似问题