R 编写OLS函数以对大数据帧值运行回归

R 编写OLS函数以对大数据帧值运行回归,r,time-series,R,Time Series,我有一个巨大的数据框架,包含从1970年1月到2009年12月的7个不同国家的月度股票回报(行),包括美国(列)。我的任务是使用4个不同时间段的值,即70年代、80年代、90年代和00年代,将每个国家的股票收益率(因变量)回归到美国股票收益率(自变量)上 数据集(.csv)可在以下位置下载: 这意味着我要分别运行24个回归并报告结果,我已经使用lm()函数完成了这项工作。但是,我目前正在尝试使用更智能的工具,创建自定义函数,以实现我的目标并产生24组结果 我创建了子数据框,其中包含根据时间段进

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

数据集(.csv)可在以下位置下载:

这意味着我要分别运行24个回归并报告结果,我已经使用
lm()
函数完成了这项工作。但是,我目前正在尝试使用更智能的工具,创建自定义函数,以实现我的目标并产生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个回归需要对循环使用叠瓦

谁能提供我必须采取的步骤来编写一个函数,以达到预期的结果?一些R代码片段也将被欣赏。我还认为将使用
mapply
函数


谢谢,如果我的文章需要编辑,请告诉我。

这不是一个完整的答案,而是一个开始

首先,我认为将数据集拆分为不同的对象是错误的。这只会让它更难处理。最好是在数据框中添加一个指示符变量,例如

> 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
mydata名称(mydata) >mydata十年 >总目(mydata) 美国国家1国家2国家3国家4国家5国家6十年 1 0.2-0.1 0.8 0.9-1.6-0.1-1.1七十年代 20.0-0.50.1-0.4-1.2-0.91.3七十年代 3 2.2 1.4 1.7 1.0-1.6-1.5 0.6 70年代 4-0.5 2.5 0.2-0.9 2.3 1.0 0.1七十年代 70年代5-0.10.0-0.9-1.40.7-0.1-0.1 60.3-0.40.1 0.5 0.2 0.9-0.5 70年代
我的第二个技巧是使用重塑或重塑2库将其转换为长格式,例如

> 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
>库(2)
>mydata.m头(mydata.m)
美国十年可变值
1 0.2 70年代国家1-0.1
2 0.0 70年代国家1-0.5
3 2.2 70年代国家1 1.4
4-0.5 70年代国家1 2.5
5-0.1 70年代国家1 0.0
6 0.3 70年代国家1-0.4
从这里你有一系列的选择。您可以使用base中的tapply()或plyr包中的内容。您甚至可以将其作为一个大模型进行拟合,变量和十年之间相互作用(给出与24个模型相似但不完全相同的结果,这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
>国家
国家1国家2国家3国家4国家5国家6
80数字,120数字,120数字,120数字,120数字,120数字,120数字,120数字,120
九十数字,120数字,120数字,120数字,120数字,120数字,120数字,120数字,120
七十位数,120位数,120位数,120位数,120位数,120位数,120位数,120位数,120位数,120位数
二十位数,120位数,120位数,120位数,120位数,120位数,120位数,120位数,120位数,120位数
>国家[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中,循环在向量中一次只做一个元素几乎总是一个坏主意,但是使用它们在一个模型中一次做一件事情,有时对代码读者来说比更深奥的操作更透明。当数据以数千行而不是数百万行计算时,操作速度不会成为问题(例如,这里的数据集实际上非常小),因此,代码的透明性和检查的方便性成为选择编程方法的真正标准。

如果您只想获得关于高效R编码的提示,这可能会导致堆栈溢出。如果您想知道lm是否是用于此目的的一个好工具,或者可以考虑数据的时间序列性质的替代策略是什么,这里可以(但您还没有问这个问题)。就目前而言,虽然我不太明白练习的目的——24个模型的拟合似乎并不过分,即使你通过24次剪切和粘贴一行代码来完成,而且数据集非常小,那么找到一种有效的方法的必要性是什么呢?@PeterEllis,正如我前面解释的,我已经使用lm()函数剪切和粘贴了24次。但我正在学习如何用R编写函数,特别是如何不使用循环,我认为这个练习适合获得这些知识,因为我想让R成为我的主要编程语言,因此这些知识将来可能会更有用。我投票决定关闭并迁移到堆栈交换。我已经按照程序给出了一个答案