使用列中的因变量计算滚动回归的系数
Calculate coefficients of rolling regressions with dependent variables in the columns
我希望计算滚动回归的系数(尤其是截距)。有很多因变量。其中一些(Y1 和 Y2)如下所示。他们每个人都用自变量 X1 和 X2 进行回归。此外,Y1 和 Y2 在不同时期都有 NA。数据是一个以月为间隔的时间序列。滚动window是6.
这是我的代码:
rr <- rollapply(df, width = 6,
FUN = function(z) coef(lm(Y1~ X1+X2,
data = as.data.frame(z))),
by.column = FALSE, align = "right")
但是,这段代码的问题在于
1) 它一次只处理一个自变量(在本例中为 Y1),
2)它为所有滚动回归提供了相同的系数。我假设 NA 的存在搞砸了滚动回归?
如果有人能阐明一些观点,我将不胜感激。谢谢
这是示例数据。
Date Y1 Y2 X1 X2
1/1/2009 NA 1.51 0.02 0.75
2/1/2009 NA -0.38 0.01 0.59
3/1/2009 NA 1.54 0.02 0.96
4/1/2009 NA 1.78 0.01 0.92
5/1/2009 NA 0.94 0.02 0.02
6/1/2009 NA 1.37 0.01 0.46
7/1/2009 NA 1.22 0.01 0.61
8/1/2009 NA 1.32 0.01 0.04
9/1/2009 NA 0.83 0.01 0.03
10/1/2009 NA 0.95 0.02 0.61
11/1/2009 NA 0.28 0.03 0.53
12/1/2009 NA 0.17 0.01 0.32
1/1/2010 1.71 NA 0.03 0.53
2/1/2010 0.39 NA 0.03 0.16
3/1/2010 0.11 NA 0.01 0.58
4/1/2010 1.25 NA 0.01 0.41
5/1/2010 0.57 NA 0.01 0.9
6/1/2010 0.48 NA 0.01 0.58
7/1/2010 0.16 NA 0.01 0.03
8/1/2010 0.37 NA 0.01 0.23
9/1/2010 0.31 NA 0.01 0.77
10/1/2010 0.63 NA 0.01 0.75
11/1/2010 0.61 NA 0.01 0.74
12/1/2010 0.91 NA 0.01 0.41
有两个问题:
将 data.frame 传递给 rollapply
导致它被转换为矩阵,并且由于其中一列是字符列,结果将是字符矩阵,而数字是需要什么。使用 df[-1]
或下面显示的代码。
lm
不接受具有所有 NA 值的因变量。在这种情况下检查 return NA。
添加一些改进:
- 首先将输入转换为class动物园。
- 定义函数
getCoef
得到给定数据和公式左右两边的系数
- 定义函数
roll
使用 rollapplyr
来完成实际的 rollapply
lapply
函数 roll
在 c("Y1", "Y2")
上生成一个包含 2 个动物园对象的列表
- 可选择将
fortify.zoo
映射到 L
以给出数据帧列表
代码:
z <- read.zoo(df, FUN = as.yearmon, format = "%m/%d/%Y")
getCoef <- function(z, lhs, rhs) {
if (all(is.na(z[, lhs]))) NA
else coef(lm(paste(lhs, "~", rhs), z))
}
roll <- function(z, lhs, rhs = "X1 + X2") {
rollapplyr(z, 6, getCoef, by.column = FALSE, coredata = FALSE, lhs = lhs, rhs = rhs)
}
ynames <- c("Y1", "Y2")
L <- lapply(ynames, roll, z = z)
可选,对于 data.frame 的列表:
Map(fortify.zoo, L)
注意:可重现形式的输入df
是:
Lines <- "Date Y1 Y2 X1 X2
1/1/2009 NA 1.51 0.02 0.75
2/1/2009 NA -0.38 0.01 0.59
3/1/2009 NA 1.54 0.02 0.96
4/1/2009 NA 1.78 0.01 0.92
5/1/2009 NA 0.94 0.02 0.02
6/1/2009 NA 1.37 0.01 0.46
7/1/2009 NA 1.22 0.01 0.61
8/1/2009 NA 1.32 0.01 0.04
9/1/2009 NA 0.83 0.01 0.03
10/1/2009 NA 0.95 0.02 0.61
11/1/2009 NA 0.28 0.03 0.53
12/1/2009 NA 0.17 0.01 0.32
1/1/2010 1.71 NA 0.03 0.53
2/1/2010 0.39 NA 0.03 0.16
3/1/2010 0.11 NA 0.01 0.58
4/1/2010 1.25 NA 0.01 0.41
5/1/2010 0.57 NA 0.01 0.9
6/1/2010 0.48 NA 0.01 0.58
7/1/2010 0.16 NA 0.01 0.03
8/1/2010 0.37 NA 0.01 0.23
9/1/2010 0.31 NA 0.01 0.77
10/1/2010 0.63 NA 0.01 0.75
11/1/2010 0.61 NA 0.01 0.74
12/1/2010 0.91 NA 0.01 0.41"
df <- read.table(text = Lines, header = TRUE)
我希望计算滚动回归的系数(尤其是截距)。有很多因变量。其中一些(Y1 和 Y2)如下所示。他们每个人都用自变量 X1 和 X2 进行回归。此外,Y1 和 Y2 在不同时期都有 NA。数据是一个以月为间隔的时间序列。滚动window是6.
这是我的代码:
rr <- rollapply(df, width = 6,
FUN = function(z) coef(lm(Y1~ X1+X2,
data = as.data.frame(z))),
by.column = FALSE, align = "right")
但是,这段代码的问题在于
1) 它一次只处理一个自变量(在本例中为 Y1),
2)它为所有滚动回归提供了相同的系数。我假设 NA 的存在搞砸了滚动回归?
如果有人能阐明一些观点,我将不胜感激。谢谢
这是示例数据。
Date Y1 Y2 X1 X2
1/1/2009 NA 1.51 0.02 0.75
2/1/2009 NA -0.38 0.01 0.59
3/1/2009 NA 1.54 0.02 0.96
4/1/2009 NA 1.78 0.01 0.92
5/1/2009 NA 0.94 0.02 0.02
6/1/2009 NA 1.37 0.01 0.46
7/1/2009 NA 1.22 0.01 0.61
8/1/2009 NA 1.32 0.01 0.04
9/1/2009 NA 0.83 0.01 0.03
10/1/2009 NA 0.95 0.02 0.61
11/1/2009 NA 0.28 0.03 0.53
12/1/2009 NA 0.17 0.01 0.32
1/1/2010 1.71 NA 0.03 0.53
2/1/2010 0.39 NA 0.03 0.16
3/1/2010 0.11 NA 0.01 0.58
4/1/2010 1.25 NA 0.01 0.41
5/1/2010 0.57 NA 0.01 0.9
6/1/2010 0.48 NA 0.01 0.58
7/1/2010 0.16 NA 0.01 0.03
8/1/2010 0.37 NA 0.01 0.23
9/1/2010 0.31 NA 0.01 0.77
10/1/2010 0.63 NA 0.01 0.75
11/1/2010 0.61 NA 0.01 0.74
12/1/2010 0.91 NA 0.01 0.41
有两个问题:
将 data.frame 传递给
rollapply
导致它被转换为矩阵,并且由于其中一列是字符列,结果将是字符矩阵,而数字是需要什么。使用df[-1]
或下面显示的代码。lm
不接受具有所有 NA 值的因变量。在这种情况下检查 return NA。
添加一些改进:
- 首先将输入转换为class动物园。
- 定义函数
getCoef
得到给定数据和公式左右两边的系数 - 定义函数
roll
使用rollapplyr
来完成实际的 lapply
函数roll
在c("Y1", "Y2")
上生成一个包含 2 个动物园对象的列表- 可选择将
fortify.zoo
映射到L
以给出数据帧列表
rollapply
代码:
z <- read.zoo(df, FUN = as.yearmon, format = "%m/%d/%Y")
getCoef <- function(z, lhs, rhs) {
if (all(is.na(z[, lhs]))) NA
else coef(lm(paste(lhs, "~", rhs), z))
}
roll <- function(z, lhs, rhs = "X1 + X2") {
rollapplyr(z, 6, getCoef, by.column = FALSE, coredata = FALSE, lhs = lhs, rhs = rhs)
}
ynames <- c("Y1", "Y2")
L <- lapply(ynames, roll, z = z)
可选,对于 data.frame 的列表:
Map(fortify.zoo, L)
注意:可重现形式的输入df
是:
Lines <- "Date Y1 Y2 X1 X2
1/1/2009 NA 1.51 0.02 0.75
2/1/2009 NA -0.38 0.01 0.59
3/1/2009 NA 1.54 0.02 0.96
4/1/2009 NA 1.78 0.01 0.92
5/1/2009 NA 0.94 0.02 0.02
6/1/2009 NA 1.37 0.01 0.46
7/1/2009 NA 1.22 0.01 0.61
8/1/2009 NA 1.32 0.01 0.04
9/1/2009 NA 0.83 0.01 0.03
10/1/2009 NA 0.95 0.02 0.61
11/1/2009 NA 0.28 0.03 0.53
12/1/2009 NA 0.17 0.01 0.32
1/1/2010 1.71 NA 0.03 0.53
2/1/2010 0.39 NA 0.03 0.16
3/1/2010 0.11 NA 0.01 0.58
4/1/2010 1.25 NA 0.01 0.41
5/1/2010 0.57 NA 0.01 0.9
6/1/2010 0.48 NA 0.01 0.58
7/1/2010 0.16 NA 0.01 0.03
8/1/2010 0.37 NA 0.01 0.23
9/1/2010 0.31 NA 0.01 0.77
10/1/2010 0.63 NA 0.01 0.75
11/1/2010 0.61 NA 0.01 0.74
12/1/2010 0.91 NA 0.01 0.41"
df <- read.table(text = Lines, header = TRUE)