К сожалению, функция checkresiduals()
не возвращает значения, просто prints()
их. Вы можете увидеть функцию, написав checkresiduals
без скобок. Или вы проверяете github разработчика.
Вы можете переписать функцию, поместив в нее return()
. Я просто копирую, вставляю функцию и вставляю ее в конце:
checkresiduals <- function(object, lag, df=NULL, test, plot=TRUE, ...) {
showtest <- TRUE
if (missing(test)) {
if (is.element("lm", class(object))) {
test <- "BG"
} else {
test <- "LB"
}
showtest <- TRUE
}
else if (test != FALSE) {
test <- match.arg(test, c("LB", "BG"))
showtest <- TRUE
}
else {
showtest <- FALSE
}
# Extract residuals
if (is.element("ts", class(object)) | is.element("numeric", class(object))) {
residuals <- object
object <- list(method = "Missing")
}
else {
residuals <- residuals(object)
}
if (length(residuals) == 0L) {
stop("No residuals found")
}
if ("ar" %in% class(object)) {
method <- paste("AR(", object$order, ")", sep = "")
} else if (!is.null(object$method)) {
method <- object$method
} else if ("HoltWinters" %in% class(object)) {
method <- "HoltWinters"
} else if ("StructTS" %in% class(object)) {
method <- "StructTS"
} else {
method <- try(as.character(object), silent = TRUE)
if ("try-error" %in% class(method)) {
method <- "Missing"
} else if (length(method) > 1 | base::nchar(method[1]) > 50) {
method <- "Missing"
}
}
if (method == "Missing") {
main <- "Residuals"
} else {
main <- paste("Residuals from", method)
}
if (plot) {
suppressWarnings(ggtsdisplay(residuals, plot.type = "histogram", main = main, ...))
}
# Check if we have the model
if (is.element("forecast", class(object))) {
object <- object$model
}
if (is.null(object) | !showtest) {
return(invisible())
}
# Seasonality of data
freq <- frequency(residuals)
# Find model df
if(grepl("STL \\+ ", method)){
warning("The fitted degrees of freedom is based on the model used for the seasonally adjusted data.")
}
df <- modeldf(object)
if (missing(lag)) {
lag <- ifelse(freq > 1, 2 * freq, 10)
lag <- min(lag, round(length(residuals)/5))
lag <- max(df+3, lag)
}
if (!is.null(df)) {
if (test == "BG") {
# Do Breusch-Godfrey test
BGtest <- lmtest::bgtest(object, order = lag)
BGtest$data.name <- main
print(BGtest)
return(BGtest)
}
else {
# Do Ljung-Box test
LBtest <- Box.test(zoo::na.approx(residuals), fitdf = df, lag = lag, type = "Ljung")
LBtest$method <- "Ljung-Box test"
LBtest$data.name <- main
names(LBtest$statistic) <- "Q*"
print(LBtest)
cat(paste("Model df: ", df, ". Total lags used: ", lag, "\n\n", sep = ""))
return(LBtest)
}
}
}
вам также нужна функция modeldf()
из файла github
modeldf <- function(object, ...){
UseMethod("modeldf")
}
modeldf.Arima <- function(object, ...){
length(object$coef)
}
С этим решением вы используете свою оригинальную функцию проверки остатков. Теперь вы можете вызвать p.value с помощью:
res_values <- checkresiduals(TS_FORECAST, plot = TRUE)
res_values$p.value
Вы также можете просто использовать Ljung-Box
и Breusch-Godfrey test
самостоятельно и игнорировать функцию checkresiduals()
, поскольку именно это checkresiduals()
делает.
Я думал, что редактирование функции checkresiduals()
- более удобный способ, поэтому вы можете использовать ее так, как привыкли к ней. Вы можете вставить его в свой код, и он должен делать свою работу. Просто убедитесь, что вы объявили modeldf()
и modeldf().Arima
перед вызовом функции. Также это работает или проверить функцию.
Вариант 2
потому что это возможно:
Вы можете захватить вывод с помощью capture.output()
capture.output(checkresiduals(TS_FORECAST, plot = FALSE))[5]
"Q * = 4,8322, df = 5, значение p = 0,4367"
С помощью команды grep должна быть возможность извлечь значение p без изменения функции. Так как я не знаком с grep, я не могу дать правильный ответ на эту задачу.