2017-03-05 98 views
1

比方说,我有以下数据:如何在功能的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在上面的代码养活β函数的参数。但我收到此错误:

Error in FUN(data[posns, ], ...) : unused argument (data[posns, ])

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

+0

你能解释一下你正在尝试用'rollapplyr'做,它来自什么包?我从来没有见过这个功能。 – useR

+0

@useR rollapply函数来自zoo包。我试图做的是在宽度= 6的窗口中滚动运行我的回归(仅举例)。 –

+0

什么是期望的结果? – useR

回答

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) 

Error in eval(expr, envir, enclos) : object 'y' not found

这是因为yx1没有的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..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..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.framelm工作。

这里有两个链接,讨论这个问题与rollapplyr

Is there a function like rollapply for data.frame

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

+0

非常感谢,@useR。新的代码为我工作,我想我应该花更多的时间来让R更加舒适。 –