如何在rollapply中使用自定义函数

时间:2017-02-27 02:13:52

标签: r data.table rollapply

我有一个自定义函数,它运行回归并以所需方式返回结果。该函数名为“reg.fun”。例如,我可以运行这样的代码:

results <- dt[ ,reg.fun(.SD, depvar="Y", indepvars=c("X1", "X2")),
              .SDcols=c("Y", "X1", "X2"), by = id]

上面的代码生成如下输出:它只是以我想要的方式报告回归结果。)我在数据表中使用它来使用“by”组功能。

id  X1coef   X2coef  X1tstat  X2tstat ...other results...
A   0.0418   0.1194   2.65     3.56    ....
B   0.7903   -0.554   2.75     4.59    .....

这完美无缺,并在所需的表格中给出了结果。现在,我想使用rollapply函数以滚动窗口的方式执行相同的操作。我写的是:

regress <- dt[ ,rollapply(.SD, width = 3,
               reg.fun(.SD, depvar="Y" indepvars=c("X1","X2")) ),
              .SDcols = c("Y", "X1", "X2"), by = id]

这是我现在得到的错误:

  

match.fun(FUN)出错:     'reg.fun(.SD,depvar =“Y”,indepvars = c(“X1”,“X2”))'不是函数,字符或符号

理想情况下,我想生成相同的上表,但现在有多行用于id A和id B,因为我想在滚动窗口上运行回归。像这样的事情:

window    id  X1coef   X2coef  X1tstat  X2tstat ...other results...
  1-3      A   xxx      xxx       xxx     xxx    ....
  2-5      A   xxx      xxx       xxx     xxx
  3-6      A   xxx      xxx       xxx     xxx
   ...
  1-3      B    xxx      xxx       xxx     xxx    .....
  2-5      B    xxx      xxx       xxx     xxx
  3-6      B    xxx      xxx       xxx     xxx 

我无法找出为什么在这种情况下reg.fun不被视为rollapply的函数。

我知道我可能在很多层面上都错了,因为这是我在R的第一个项目。有人可以告诉我这是什么问题,或者如果不是这样,那么正确的方向是什么? ?

2 个答案:

答案 0 :(得分:0)

我记得你应该在逗号之后在rollapply内输入自定义函数的参数,而不是在括号中。你应该打印像rollapply(data, window, function, arg1, arg2)这样的东西。在你的情况下,它应该看起来像:

rollapply(.SD, 3, reg.fun, depvar="Y", indepvars = c("X1", "X2")), .SDcols = c("Y", "X1", "X2"), by = id)

另外rollapply by参数最有可能是数字!

似乎你的自定义函数reg.fun也有by参数,这是不明确的,也可能导致错误。

答案 1 :(得分:0)

regress <- dt[ ,rollapply(.SD, width = 3, reg.fun, depvar="Y",
                indepvars=c("X1","X2")), .SDcols = c("Y", "X1", "X2"), by = id]