R中具有非线性外生变量的ARIMA模型
ARIMA model with nonlinear exogenous variable in R
我正在 R 中进行非线性回归,并希望向我的模型添加一个移动平均项以消除残差中的自相关。
基本上,这是模型:
y[n] = a + log((x1[n])^g + (x2[n])^g) + c*e[n-1] + e[n]
其中 [e]
是移动平均项。
我计划使用 ARIMA(0, 0, 1)
对残差进行建模。但是,我不知道应该在 R 中使用哪个函数来将非线性外生部分添加到 ARIMA 模型中。
更多信息:我知道如何使用nls
命令来估计a
和g
,但不知道如何处理e[n]
。
我知道 arima
中的 xreg
可以处理具有线性外生变量的 ARIMA 模型。是否有类似的函数来处理具有非线性外生变量的ARIMA模型?
提前感谢您的帮助!
nlme
具有这种能力,因为它适合非线性混合模型。通过允许随机效应和相关误差,您可以将其视为 nls
(仅固定效应的非线性回归)的扩展。
nlme
可以通过 correlation = corARMA(0.2, ~ 1, p = 0, q = 1, fixed = TRUE)
之类的方式处理 ARMA 相关性。这意味着,残差是 MA(1) 过程,初始猜测系数为 0.2,但要在模型拟合期间更新。 ~ 1
表示 MA(1)
处于拦截状态,没有进一步的分组结构。
我不是 nlme
方面的专家,但我知道 nlme
是您所需要的。我生成了以下示例,但由于我不是专家,所以我现在无法 nlme
工作。我post它在这里给一个开始/味道。
set.seed(0)
x1 <- runif(100)
x2 <- runif(100)
## MA(1) correlated error, with innovation standard deviation 0.1
e <- arima.sim(model = list(ma = 0.5), n = 100, sd = 0.1)
## a true model, with `a = 0.2, g = 0.5`
y0 <- 0.2 + log(x1 ^ 0.5 + x2 ^ 0.5)
## observations
y <- y0 + e
## no need to install; it comes with R; just `library()` it
library(nlme)
fit <- nlme(y ~ a + log(x1 ^ g + x2 ^ g), fixed = a + g ~ 1,
start = list(a = 0.5, g = 1),
correlation = corARMA(0.2, form = ~ 1, p = 0, q = 1, fixed = FALSE))
类似于nls
,我们有一个整体模型公式y ~ a + log(x1 ^ g + x2 ^ g)
,迭代过程需要起始值。我选择了start = list(a = 0.5, g = 1)
。 correlation
位在开头已经解释过了
fixed
和 nlme
中的 random
参数指定在整个公式中应该将什么视为固定效应和随机效应。由于我们没有随机效应,因此我们将其未指定。我们希望 a
和 g
作为固定效果,所以我尝试了类似 fixed = a + g ~ 1
的方法。不幸的是,由于某种我不知道的原因,它不太有效。我读了 ?nlme
,并认为这个公式意味着我们想要一个共同的 a
和 g
用于所有观察,但后来 nlme
报告错误说这不是有效的分组公式。
我也在投资这个;正如我所说,以上内容给了我们一个开始。我们已经非常接近最终答案了。
感谢 user20650 指出我尴尬的错误。我应该使用 gnls
函数而不是 nlme
。根据 nlme
包的设计性质,函数 lme
和 nlme
必须采用 random
参数才能工作。幸运的是,nlme
包中还有其他几个用于扩展线性模型和非线性模型的例程。
gls
和 gnls
通过允许非对角方差函数扩展 lm
和 nls
。
所以,我真的应该使用 gnls
来代替:
## no `fixed` argument as `gnls` is a fixed-effect only
fit <- gnls(y ~ a + log(x1 ^ g + x2 ^ g), start = list(a = 0.5, g = 1),
correlation = corARMA(0.2, form = ~ 1, p = 0, q = 1, fixed = FALSE))
#Generalized nonlinear least squares fit
# Model: y ~ a + log(x1^g + x2^g)
# Data: NULL
# Log-likelihood: 92.44078
#
#Coefficients:
# a g
#0.1915396 0.5007640
#
#Correlation Structure: ARMA(0,1)
# Formula: ~1
# Parameter estimate(s):
# Theta1
#0.4184961
#Degrees of freedom: 100 total; 98 residual
#Residual standard error: 0.1050295
我正在 R 中进行非线性回归,并希望向我的模型添加一个移动平均项以消除残差中的自相关。
基本上,这是模型:
y[n] = a + log((x1[n])^g + (x2[n])^g) + c*e[n-1] + e[n]
其中 [e]
是移动平均项。
我计划使用 ARIMA(0, 0, 1)
对残差进行建模。但是,我不知道应该在 R 中使用哪个函数来将非线性外生部分添加到 ARIMA 模型中。
更多信息:我知道如何使用nls
命令来估计a
和g
,但不知道如何处理e[n]
。
我知道 arima
中的 xreg
可以处理具有线性外生变量的 ARIMA 模型。是否有类似的函数来处理具有非线性外生变量的ARIMA模型?
提前感谢您的帮助!
nlme
具有这种能力,因为它适合非线性混合模型。通过允许随机效应和相关误差,您可以将其视为 nls
(仅固定效应的非线性回归)的扩展。
nlme
可以通过 correlation = corARMA(0.2, ~ 1, p = 0, q = 1, fixed = TRUE)
之类的方式处理 ARMA 相关性。这意味着,残差是 MA(1) 过程,初始猜测系数为 0.2,但要在模型拟合期间更新。 ~ 1
表示 MA(1)
处于拦截状态,没有进一步的分组结构。
我不是 nlme
方面的专家,但我知道 nlme
是您所需要的。我生成了以下示例,但由于我不是专家,所以我现在无法 nlme
工作。我post它在这里给一个开始/味道。
set.seed(0)
x1 <- runif(100)
x2 <- runif(100)
## MA(1) correlated error, with innovation standard deviation 0.1
e <- arima.sim(model = list(ma = 0.5), n = 100, sd = 0.1)
## a true model, with `a = 0.2, g = 0.5`
y0 <- 0.2 + log(x1 ^ 0.5 + x2 ^ 0.5)
## observations
y <- y0 + e
## no need to install; it comes with R; just `library()` it
library(nlme)
fit <- nlme(y ~ a + log(x1 ^ g + x2 ^ g), fixed = a + g ~ 1,
start = list(a = 0.5, g = 1),
correlation = corARMA(0.2, form = ~ 1, p = 0, q = 1, fixed = FALSE))
类似于nls
,我们有一个整体模型公式y ~ a + log(x1 ^ g + x2 ^ g)
,迭代过程需要起始值。我选择了start = list(a = 0.5, g = 1)
。 correlation
位在开头已经解释过了
fixed
和 nlme
中的 random
参数指定在整个公式中应该将什么视为固定效应和随机效应。由于我们没有随机效应,因此我们将其未指定。我们希望 a
和 g
作为固定效果,所以我尝试了类似 fixed = a + g ~ 1
的方法。不幸的是,由于某种我不知道的原因,它不太有效。我读了 ?nlme
,并认为这个公式意味着我们想要一个共同的 a
和 g
用于所有观察,但后来 nlme
报告错误说这不是有效的分组公式。
我也在投资这个;正如我所说,以上内容给了我们一个开始。我们已经非常接近最终答案了。
感谢 user20650 指出我尴尬的错误。我应该使用 gnls
函数而不是 nlme
。根据 nlme
包的设计性质,函数 lme
和 nlme
必须采用 random
参数才能工作。幸运的是,nlme
包中还有其他几个用于扩展线性模型和非线性模型的例程。
gls
和gnls
通过允许非对角方差函数扩展lm
和nls
。
所以,我真的应该使用 gnls
来代替:
## no `fixed` argument as `gnls` is a fixed-effect only
fit <- gnls(y ~ a + log(x1 ^ g + x2 ^ g), start = list(a = 0.5, g = 1),
correlation = corARMA(0.2, form = ~ 1, p = 0, q = 1, fixed = FALSE))
#Generalized nonlinear least squares fit
# Model: y ~ a + log(x1^g + x2^g)
# Data: NULL
# Log-likelihood: 92.44078
#
#Coefficients:
# a g
#0.1915396 0.5007640
#
#Correlation Structure: ARMA(0,1)
# Formula: ~1
# Parameter estimate(s):
# Theta1
#0.4184961
#Degrees of freedom: 100 total; 98 residual
#Residual standard error: 0.1050295