如何输入 rollapplyr FUN 中使用的函数的参数
How to feed in the arguments of a function used in rollapplyr FUN
假设我有以下数据:
input <- data.frame(id=rep(c('A', 'B'), c(10, 10)),year=rep(1:10, 2),
y=c(rnorm(10), rnorm(10)),x1 = c(rnorm(10),rnorm(10)))
我想使用 rollapplyr 进行滚动回归。首先我定义了一个 beta 函数:
# Simple Regression
beta <- function(x, indepvar, depvar) {
a <- coef(lm(formula = indepvar ~ depvar, data = x))
return(a)
}
现在我想在 rollapplyr 设置中使用这个函数。 (我知道我可以在 rollapplyr 中定义函数,但我想了解这个概念。)
rollapplyr(input, width = 6,
FUN = beta, x = input, indepvar = y, depvar = x1,
by.column = FALSE)
我试图通过在上面的代码中定义输入、indepvar 和 depvar 来提供 beta 函数的参数。但我收到此错误:
Error in FUN(data[posns, ], ...) : unused argument (data[posns, ])
这里有一个问题:unused arguments但是我不明白我没有使用什么参数。这个错误在我的上下文中意味着什么?为什么我得到它?
我认为这里有几个问题。让我带您了解最关键的问题:
# Simple Regression
beta <- function(x, indepvar, depvar) {
a <- coef(lm(formula = indepvar ~ depvar, data = x))
return(a)
}
您编写函数的方式 beta
意味着您必须输入数据 x
、indepvar
列和 depvar
列。但这对 lm
不起作用,因为 indepvar
和 depvar
包含 的内容被馈入,而不是 变量名称。例如,以下将不起作用:
beta(input, y, x1)
Error in eval(expr, envir, enclos) : object 'y' not found
这是因为 y
和 x1
在 input
之外不存在。您的 rollapplyr
也有同样的问题。解决这个问题的一种方法是写:
beta <- function(indepvar, depvar) {
a <- coef(lm(indepvar ~ depvar))
return(a)
}
并明确输入如下列:
# > beta(input[,3],input[,4])
# (Intercept) depvar
# 0.1308993 0.2373399
现在可以了:
rollapplyr(input[3:4], width = 6,
FUN = function(x) beta(x[,1], x[,2]),
by.column = FALSE)
# (Intercept) depvar
# [1,] -0.04987909 0.6433585022
# [2,] -0.23739671 0.7527017129
# [3,] -0.40483456 0.5833452315
# [4,] -0.28191172 0.6660916836
# [5,] 0.02886934 0.5334114615
# [6,] 0.17284232 0.8126499211
# [7,] 0.01236415 0.3194661428
# [8,] 0.48156300 -0.1532216150
# [9,] 0.75965765 -0.1993015431
# [10,] 0.80509109 -0.1822009137
# [11,] 0.55055694 -0.0005880675
# [12,] 0.53963291 -0.0262970723
# [13,] 0.46509011 0.0570725348
# [14,] 0.33227459 0.1598345855
# [15,] -0.20316429 0.2757045612
如果您希望能够按名称调用列,您可以将 beta
函数编写为:
library(zoo)
beta <- function(x, indepvar, depvar) {
a <- coef(lm(as.formula(paste(indepvar, "~", depvar)),
data = x))
return(a)
}
rollapplyr(input[3:4], width = 6,
FUN = function(x) beta(as.data.frame(x), "y", "x1"),
by.column = FALSE)
# (Intercept) x1
# [1,] -0.04987909 0.6433585022
# [2,] -0.23739671 0.7527017129
# [3,] -0.40483456 0.5833452315
# [4,] -0.28191172 0.6660916836
# [5,] 0.02886934 0.5334114615
# [6,] 0.17284232 0.8126499211
# [7,] 0.01236415 0.3194661428
# [8,] 0.48156300 -0.1532216150
# [9,] 0.75965765 -0.1993015431
# [10,] 0.80509109 -0.1822009137
# [11,] 0.55055694 -0.0005880675
# [12,] 0.53963291 -0.0262970723
# [13,] 0.46509011 0.0570725348
# [14,] 0.33227459 0.1598345855
# [15,] -0.20316429 0.2757045612
注意我必须提供 input[3:4]
而不是 input
到 rollapplyr
因为显然 rollapplyr
只接受矩阵作为输入。如果 input
具有混合类型,rollapplyr
会将其强制转换为字符矩阵,这是不可取的。所以我必须同时提供仅数字列 和 将其强制返回 data.frame 和 as.data.frame
以使 lm
工作。
这里有两个 link 与 rollapplyr
讨论这个问题:
Is there a function like rollapply for data.frame
Can `ddply` (or similar) do a sliding window?
假设我有以下数据:
input <- data.frame(id=rep(c('A', 'B'), c(10, 10)),year=rep(1:10, 2),
y=c(rnorm(10), rnorm(10)),x1 = c(rnorm(10),rnorm(10)))
我想使用 rollapplyr 进行滚动回归。首先我定义了一个 beta 函数:
# Simple Regression
beta <- function(x, indepvar, depvar) {
a <- coef(lm(formula = indepvar ~ depvar, data = x))
return(a)
}
现在我想在 rollapplyr 设置中使用这个函数。 (我知道我可以在 rollapplyr 中定义函数,但我想了解这个概念。)
rollapplyr(input, width = 6,
FUN = beta, x = input, indepvar = y, depvar = x1,
by.column = FALSE)
我试图通过在上面的代码中定义输入、indepvar 和 depvar 来提供 beta 函数的参数。但我收到此错误:
Error in FUN(data[posns, ], ...) : unused argument (data[posns, ])
这里有一个问题:unused arguments但是我不明白我没有使用什么参数。这个错误在我的上下文中意味着什么?为什么我得到它?
我认为这里有几个问题。让我带您了解最关键的问题:
# Simple Regression
beta <- function(x, indepvar, depvar) {
a <- coef(lm(formula = indepvar ~ depvar, data = x))
return(a)
}
您编写函数的方式 beta
意味着您必须输入数据 x
、indepvar
列和 depvar
列。但这对 lm
不起作用,因为 indepvar
和 depvar
包含 的内容被馈入,而不是 变量名称。例如,以下将不起作用:
beta(input, y, x1)
Error in eval(expr, envir, enclos) : object 'y' not found
这是因为 y
和 x1
在 input
之外不存在。您的 rollapplyr
也有同样的问题。解决这个问题的一种方法是写:
beta <- function(indepvar, depvar) {
a <- coef(lm(indepvar ~ depvar))
return(a)
}
并明确输入如下列:
# > beta(input[,3],input[,4])
# (Intercept) depvar
# 0.1308993 0.2373399
现在可以了:
rollapplyr(input[3:4], width = 6,
FUN = function(x) beta(x[,1], x[,2]),
by.column = FALSE)
# (Intercept) depvar
# [1,] -0.04987909 0.6433585022
# [2,] -0.23739671 0.7527017129
# [3,] -0.40483456 0.5833452315
# [4,] -0.28191172 0.6660916836
# [5,] 0.02886934 0.5334114615
# [6,] 0.17284232 0.8126499211
# [7,] 0.01236415 0.3194661428
# [8,] 0.48156300 -0.1532216150
# [9,] 0.75965765 -0.1993015431
# [10,] 0.80509109 -0.1822009137
# [11,] 0.55055694 -0.0005880675
# [12,] 0.53963291 -0.0262970723
# [13,] 0.46509011 0.0570725348
# [14,] 0.33227459 0.1598345855
# [15,] -0.20316429 0.2757045612
如果您希望能够按名称调用列,您可以将 beta
函数编写为:
library(zoo)
beta <- function(x, indepvar, depvar) {
a <- coef(lm(as.formula(paste(indepvar, "~", depvar)),
data = x))
return(a)
}
rollapplyr(input[3:4], width = 6,
FUN = function(x) beta(as.data.frame(x), "y", "x1"),
by.column = FALSE)
# (Intercept) x1
# [1,] -0.04987909 0.6433585022
# [2,] -0.23739671 0.7527017129
# [3,] -0.40483456 0.5833452315
# [4,] -0.28191172 0.6660916836
# [5,] 0.02886934 0.5334114615
# [6,] 0.17284232 0.8126499211
# [7,] 0.01236415 0.3194661428
# [8,] 0.48156300 -0.1532216150
# [9,] 0.75965765 -0.1993015431
# [10,] 0.80509109 -0.1822009137
# [11,] 0.55055694 -0.0005880675
# [12,] 0.53963291 -0.0262970723
# [13,] 0.46509011 0.0570725348
# [14,] 0.33227459 0.1598345855
# [15,] -0.20316429 0.2757045612
注意我必须提供 input[3:4]
而不是 input
到 rollapplyr
因为显然 rollapplyr
只接受矩阵作为输入。如果 input
具有混合类型,rollapplyr
会将其强制转换为字符矩阵,这是不可取的。所以我必须同时提供仅数字列 和 将其强制返回 data.frame 和 as.data.frame
以使 lm
工作。
这里有两个 link 与 rollapplyr
讨论这个问题:
Is there a function like rollapply for data.frame
Can `ddply` (or similar) do a sliding window?