恐怕我遇到了估计问题。
我有两个变量,X 和 Y。Y 由 X 的 n 个滞后值的加权和来解释。我的目标是估计以下两个参数 c(alpha0,alpha1):
Yt = 从 j=1 到 n 的总和 ( ( alpha0 + alpha1 * j ) * Xt-j )
其中 Xt-j 表示 X 的第 j 个滞后。
我提出了这种方法,因为我认为估计权重的斜率而不是为每个添加的 X 滞后估计一个参数是一个好主意(我打算将 n 设置得非常大)。
模型噪声 ut 被添加,假设它是正态分布的,均值为 0,标准差为 sigma。
假设我想设置n=510,那么我需要原始系列和 510 滞后系列。为了避免系列中的任何 NA,我将原始数据转换为“data_chopped”,仅包含前 510 个观察值被删除后的观察值,以及矩阵“data_lagged”,其中每列代表一个滞后序列:
library(stats)
data<-arima.sim(n=10000,list(ar=0.15,ma=0.1),mean=0.5)
data_chopped<-data[511:length(data)]
data_lagged<-matrix(nrow=length(data_chopped),ncol=510)
for (i in 1:510){
data_lagged[,i]<-head(data,-i)[(511-i):length(head(data,-i))]
}
#Check result:
cbind(data_chopped,data_lagged[,1:3])
#data_lagged[,1] is the first lag of the original data, data_lagged[,2] is the second lag, and so on. No NAs whatsoever to deal with
为了演示我的对数似然函数和生成的系列的“工作顺序”,我首先想拟合一个 AR(3) 模型:
logl<-function(sigma,alpha,beta,gamma){
-sum(log((1/(sqrt(2*pi)*sigma)) * exp(-((
data_chopped
-alpha*data_lagged[,1]
-beta*data_lagged[,2]
-gamma*data_lagged[,3]
)^2)/(2*sigma^2))))
}
library(stats4)
mle(logl,start=list(sigma=1,alpha=0,beta=0,gamma=0),method="L-BFGS-B")
当我现在尝试以同样的方式估计我的模型时,它就不起作用了。我从来没有在对数似然函数中使用循环,这就是我刚刚写出上述模型的原因。所以,
Yt = 从 j=1 到 n 的总和 ( ( alpha0 + alpha1 * j ) * Xt-j )
= (alpha+beta*1)*Xt-1 + (alpha+beta*2)*Xt-2 + (alpha+beta*3)*Xt-3 + ... + (alpha+beta*510)*Xt -510
logl<-function(sigma,alpha,beta){
-sum(log((1/(sqrt(2*pi)*sigma)) * exp(-((
data_chopped
-(alpha + beta*1)*data_lagged[,1]
-(alpha + beta*2)*data_lagged[,2]
-(alpha + beta*3)*data_lagged[,3]
-(alpha + beta*4)*data_lagged[,4]
-(alpha + beta*5)*data_lagged[,5]
...
-(alpha + beta*510)*data_lagged[,510]
)^2)/(2*sigma^2))))
}
library(stats4)
mle(logl,start=list(sigma=1,alpha=0.5,beta=0),method="L-BFGS-B")
Error in optim(start, f, method = method, hessian = TRUE, ...) :
L-BFGS-B needs finite values of 'fn'
如果我只尝试几行,我不会收到错误:
logl<-function(sigma,alpha,beta){
-sum(log((1/(sqrt(2*pi)*sigma)) * exp(-((
data_chopped
-(alpha + beta*1)*data_lagged[,1]
-(alpha + beta*2)*data_lagged[,2]
-(alpha + beta*3)*data_lagged[,3]
-(alpha + beta*4)*data_lagged[,4]
-(alpha + beta*5)*data_lagged[,5]
)^2)/(2*sigma^2))))
}
library(stats4)
mle(logl,start=list(sigma=1,alpha=0.5,beta=0),method="L-BFGS-B")
Call:
mle(minuslogl = logl, start = list(sigma = 1, alpha = 0.5, beta = 0),
method = "L-BFGS-B")
Coefficients:
sigma alpha beta
1.07797708 0.26178848 -0.04378526
有人可以帮我解决这个问题吗?