我认为这里有几个问题。让我带你通过最关键的:
# 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..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]
而不仅仅是input
到rollapplyr
,因为显然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?
你能解释一下你正在尝试用'rollapplyr'做,它来自什么包?我从来没有见过这个功能。 – useR
@useR rollapply函数来自zoo包。我试图做的是在宽度= 6的窗口中滚动运行我的回归(仅举例)。 –
什么是期望的结果? – useR