【问题标题】:How to feed in the arguments of a function used in rollapplyr FUN如何输入 rollapplyr FUN 中使用的函数的参数
【发布时间】:2017-03-05 20:32:24
【问题描述】:

假设我有以下数据:

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 函数的参数。但是我收到了这个错误:

FUN(data[posns, ], ...) 中的错误:未使用的参数 (data[posns, ])

这里有个问题:unused arguments 但我不明白我没有使用什么论据。这个错误在我的上下文中意味着什么?为什么我会得到它?

【问题讨论】:

  • 你能解释一下你想用rollapplyr做什么以及它来自什么包吗?我以前从未见过这个功能。
  • @user rollapply 函数来自 zoo 包。我要做的是在宽度 = 6 的窗口中滚动运行我的回归(仅作为示例)。
  • 想要的结果是什么?
  • @user 让我解释一下上面的输入数据。你可以看到我有 10 年的 y 和 x1,有两个不同的 id(A 和 B)。我想运行滚动窗口回归并保存 beta 。比如第一个回归是从year = 1到year = 7。那么下一个回归是从year = 2到year = 8。之后是从year = 3到year = 9。你可以看到。 (我的下一步是分组做,但我想在这里一步一步走,顺便说一句,我卡在了第一步。

标签: r rollapply


【解决方案1】:

我认为这里有一些问题。让我带您了解最关键的那些:

# Simple Regression
beta <- function(x, indepvar, depvar) {
  a <- coef(lm(formula = indepvar ~ depvar, data = x))
  return(a)
}

您编写函数beta 的方式意味着您必须输入数据xindepvar 列和depvar 列。但这不适用于lm,因为输入的是indepvardepvar 包含,而不是变量名。例如,以下内容将不起作用:

beta(input, y, x1)

eval(expr, envir, enclos) 中的错误:找不到对象“y”

这是因为yx1input 之外不存在。您的 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] 而不仅仅是 inputrollapplyr,因为显然 rollapplyr 只将矩阵作为输入。如果input 具有混合类型,rollapplyr 将其强制转换为字符矩阵,这是不可取的。因此,我必须同时提供仅数字列 将其强制返回 data.frame 并使用 as.data.frame 以使 lm 工作。

这里有两个与rollapplyr 讨论此问题的链接:

Is there a function like rollapply for data.frame

Can `ddply` (or similar) do a sliding window?

【讨论】:

  • 非常感谢,@user。新代码对我有用。我想我应该花更多的时间来让 R 变得更舒服。
猜你喜欢
  • 1970-01-01
  • 2017-06-30
  • 2021-08-13
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多