我有一个3个月的时间序列,每分钟的数据,我需要每天执行msmFit函数。该函数来自'MSwM包'。我的时间序列是xts对象。
我用'split'函数这样分割数据:
US.data.daily<-split(US.data2,"days")
结果是一个包含91个单元素的"list"对象。'msmFit'需要'lm'对象作为输入,所以我使用'lapply'和'lm'函数到'US.data '。每日数据如下:
mod<-lapply(US.data.daily,function(x) lm(spread~volatility,data=as.data.frame(x),na.action=na.exclude))
现在我想将msmFit应用于'mod'列表的每个元素,这里的代码:
mod_mswm<-lapply(mod,function(x) msmFit(mod,k=2,p=0,sw=c(T,T,T),control=list(parallel=F)))
返回以下错误信息:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘msmFit’ for signature ‘"list", "numeric", "logical", "numeric", "missing", "missing"’
我假设问题是列表'mod'是'list'类元素,而不是'lm'类元素。这是因为class(mod[1])
给了我'list'
我尝试使用:class(mod[1]) <-c("lm")
,但它不起作用。
我有很多建议,做一个lm对象的列表,保留它们的类,但是我不能写91遍。我正在寻找一个更快的方法
有谁知道问题是由于这个原因吗?我如何解决这个问题,或者如何将列表中的元素转换为'lm'类?我不需要改变整个列表的类,只需要改变每个元素的类。
好的,正如你所问的,这里有dput
函数给出的输出。mod_mswm <- lapply(mod, function(x) try(msmFit(x, k=2,p=0,sw=c(T,T,T),control=list(parallel=F))))
和:dput(mod_mswm_1, file = "mod_mswm_1")
输出为:
list(structure("Error in if ((max(abs(object["Fit"]["logLikel"] - oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) < : n missing value where TRUE/FALSE neededn", class = "try-error", condition = structure(list(
message = "missing value where TRUE/FALSE needed", call = if ((max(abs(object["Fit"]["logLikel"] -
oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) <
control$tol) & (max(abs(object["Coef"] - oldcoef))/(0.1 +
max(abs(object["Coef"]))) < control$tol)) break), .Names = c("message",
"call"), class = c("simpleError", "error", "condition"))), <S4 object of class structure("MSM.lm", package = "MSwM")>,
<S4 object of class structure("MSM.lm", package = "MSwM")>,
structure("Error in if ((max(abs(object["Fit"]["logLikel"] - oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) < : n missing value where TRUE/FALSE neededn", class = "try-error", condition = structure(list(
message = "missing value where TRUE/FALSE needed", call = if ((max(abs(object["Fit"]["logLikel"] -
oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) <
control$tol) & (max(abs(object["Coef"] - oldcoef))/(0.1 +
max(abs(object["Coef"]))) < control$tol)) break), .Names = c("message",
"call"), class = c("simpleError", "error", "condition"))),
structure("Error in if ((max(abs(object["Fit"]["logLikel"] - oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) < : n missing value where TRUE/FALSE neededn", class = "try-error", condition = structure(list(
message = "missing value where TRUE/FALSE needed", call = if ((max(abs(object["Fit"]["logLikel"] -
oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) <
control$tol) & (max(abs(object["Coef"] - oldcoef))/(0.1 +
max(abs(object["Coef"]))) < control$tol)) break), .Names = c("message",
"call"), class = c("simpleError", "error", "condition"))),
<S4 object of class structure("MSM.lm", package = "MSwM")>,
<S4 object of class structure("MSM.lm", package = "MSwM")>,
<S4 object of class structure("MSM.lm", package = "MSwM")>,
<S4 object of class structure("MSM.lm", package = "MSwM")>,
<S4 object of class structure("MSM.lm", package = "MSwM")>,
structure("Error in if ((max(abs(object["Fit"]["logLikel"] - oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) < : n missing value where TRUE/FALSE neededn", class = "try-error", condition = structure(list(
message = "missing value where TRUE/FALSE needed", call = if ((max(abs(object["Fit"]["logLikel"] -
oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) <
control$tol) & (max(abs(object["Coef"] - oldcoef))/(0.1 +
max(abs(object["Coef"]))) < control$tol)) break), .Names = c("message",
"call"), class = c("simpleError", "error", "condition"))),
structure("Error in if ((max(abs(object["Fit"]["logLikel"] - oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) < : n missing value where TRUE/FALSE neededn", class = "try-error", condition = structure(list(
message = "missing value where TRUE/FALSE needed", call = if ((max(abs(object["Fit"]["logLikel"] -
oldll))/(0.1 + max(abs(object["Fit"]["logLikel"]))) <
control$tol) & (max(abs(object["Coef"] - oldcoef))/(0.1 +
max(abs(object["Coef"]))) < control$tol)) break), .Names = c("message",
"call"), class = c("simpleError", "error", "condition"))),
<S4 object of class structure("MSM.lm", package = "MSwM")>,
structure("Error in solve.default(res$Hessian) : n system is computationally singular: reciprocal condition number = 2.66759e-17n", class = "try-error", condition = structure(list(
message = "system is computationally singular: reciprocal condition number = 2.66759e-17",
call = solve.default(res$Hessian)), .Names = c("message",
"call"), class = c("simpleError", "error", "condition"))),
<S4 object of class structure("MSM.lm", package = "MSwM")>)
未测试,如下所示:
mod_mswm <-
lapply(split(US.data2,"days"),
function(x)
msmFit(mod,
lm(spread~volatility,data=as.data.frame(x),na.action=na.exclude),
k=2,p=0,sw=c(T,T,T),control=list(parallel=F)))
您在function(x)
中使用mod
而不是x
。这是class
list
而不是lm
,这就是错误信息告诉你的。
mod_mswm<-lapply(mod,function(x) msmFit(x, k=2,p=0,sw=c(T,T,T),control=list(parallel=F)))
编辑:你的新错误似乎是在调用msmFit
函数时。您可以使用try
运行代码。mod_mswm <- lapply(mod, function(x)
try(msmFit(x, k=2,p=0,sw=c(T,T,T),control=list(parallel=F))))
然后你可以看
lst[sapply(mod_mswm, class)=="try-error"]
mod[sapply(mod_mswm, class)=="try-error"]
也许这让你明白了为什么你会得到这个错误。否则,您应该将输出dput
并将其作为问题的一部分发布。