我想从tsdiag
函数中检索并保存到文件中,只有一幅画出三幅。
我怎样才能做到这一点?我一直试图使用额外的参数which
,但是绘图函数仍然返回整个诊断。
tsdiag(arima_model, which = 1) # does not work
我在stats
的文档中也找不到任何东西。人工复制这些地块很容易,但如果只得到其中的一个,那就太好了。
发布于 2021-12-28 07:11:18
您可以考虑使用包tsdiag.Sarima()
sarima
(https://cran.r-project.org/package=sarima),它提供了所请求的和进一步的功能,请参见https://geobosh.github.io/sarima/reference/tsdiag.Sarima.html。tsdiag.Sarima()
的另一个特点是它使用正确的自由度来计算p值,这也是使用它的另一个原因。tsdiag.Sarima()
还提供了一些替代测试,请参阅其帮助页面或上面的链接。
例如,拟合ARIMA模型来构建AirPassengers
数据:
ap.arima <- arima(log(AirPassengers), order = c(0,1,1), seasonal = c(0,1,1))
这显示了一个与默认的tsdiag
图类似的图,但与d.f图相似。按照Ljung-Box测试的要求:
tsdiag.Sarima(ap.arima)
这还显示了Li-McLeod测试(这里删除了残差):
tsdiag.Sarima(ap.arima, plot = 2:4)
参数layout
可用于定义不同的绘图布局,有关详细信息,请参阅?layout
。在最简单的情况下,它是一个1列的矩阵。这显示了自相关和LB p值:
tsdiag.Sarima(ap.arima, plot = 2:3, layout = list(matrix(1:2, nrow = 2)))
当然,plot
可以指定非连续的地块。这说明了残差的自相关和部分自相关。
tsdiag.Sarima(ap.arima, plot = c(2,6), layout = list(matrix(1:2, nrow = 2)))
如果参数plot
指定的情节超出了布局所能容纳的范围,您将得到一个菜单来选择所需的情节:
tsdiag.Sarima(ap.arima, plot = 1:6, layout = list(matrix(1:2, nrow = 2)))
呈现的内容如下:
Select a plot number or 0 to exit
1: residuals
2: acf of residuals
3: p values for Ljung-Box statistic
4: p values for Li-McLeod statistic
5: p values for Box-Pierce statistic
6: pacf of residuals
Selection:
layout
还允许您为这些地块分配不同的空间。这将将2/(1+2+2)的垂直空间(40%)分配给第二和第三块,而只分配给第一幅(标准化残差)的20%:
tsdiag.Sarima(ap.arima, plot = c(1,2,6),
layout = list(matrix(1:3, nrow = 3),
heights = c(1,2,2)))
上述方法也适用于从auto.arima
获取的对象。对前面答案中的示例的修改使用了tsdiag.Sarima
library("forecast") # contains auto.arima
data(manaus, package = "boot")
m <- auto.arima(manaus)
tsdiag.Sarima(m) # all plots
tsdiag.Sarima(m, plot = 2, layout = list(1)) # only 2nd
tsdiag.Sarima(m, plot = 2:3, layout = list(matrix(1:2, nrow = 2))) # plot 2 & 3
发布于 2021-11-23 08:31:12
R是开源的,因此可以查看源代码并检查是否可以创建自己的用户修改函数。
tsdiag
函数在package stats,源文件ama0.R
中找到。这里是一个支持which
-argument的黑客版本:
## modified from R package stats, file `ama0.R`
tsdiag.Arima <- tsdiag.arima0 <- function(object, gof.lag = 10, which = 1L:3L, ...) {
## plot standardized residuals, acf of residuals, Ljung-Box p-values
oldpar <- par(mfrow = c(length(which), 1))
on.exit(par(oldpar))
rs <- object$residuals
if (1L %in% which) {
stdres <- rs/sqrt(object$sigma2)
plot(stdres, type = "h", main = "Standardized Residuals", ylab = "")
abline(h = 0)
}
if (2L %in% which) {
acf(object$residuals, plot = TRUE, main = "ACF of Residuals",
na.action = na.pass)
}
if (3L %in% which) {
nlag <- gof.lag
pval <- numeric(nlag)
for(i in 1L:nlag) pval[i] <- Box.test(rs, i, type="Ljung-Box")$p.value
plot(1L:nlag, pval, xlab = "lag", ylab = "p value", ylim = c(0,1),
main = "p values for Ljung-Box statistic")
abline(h = 0.05, lty = 2, col = "blue")
}
}
现在我们可以测试它了:
library("forecast") # contains auto.arima
library("boot") # contains manaus data set
m <- auto.arima(manaus)
tsdiag(m) # all plots
tsdiag(m, which=1) # only 2nd
tsdiag(m, which=2:3) # plot 2 and 3
https://stackoverflow.com/questions/70079957
复制