r语言 - 我想将 msmFit 函数应用于每一天的分钟时间序列。如何构建'lm'类对象的列表?



我有一个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并将其作为问题的一部分发布。

最新更新