我担心我会遇到估计问题。
我有两个变量,X和Y.Y由X的n个滞后值的加权和来解释。我的目标是估计两个参数c(alpha0,alpha1):
Yt =从j = 1到n的总和((alpha0 + alpha1 * j)* Xt-j)
其中Xt-j表示X的第j个滞后。
我想出了这种方法,因为我认为估计权重的斜率是一个好主意,而不是为每个添加的X的滞后估计一个参数(我打算设置n非常大)。
对模型噪声添加,其被假定为正态分布具有平均零和标准偏差西格玛。
假设我想设置 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
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我将回应不使用lag
函数的建议。它的作者和早期用户可能知道它的作用,但我们其他人都有不好的经验,没有达到预期。我发现embed
函数对我认为滞后函数应该有用。
> embed(1:8, 3)
[,1] [,2] [,3]
[1,] 3 2 1
[2,] 4 3 2
[3,] 5 4 3
[4,] 6 5 4
[5,] 7 6 5
[6,] 8 7 6
假设您想在当前时间之前回顾6次并按行进行计算。你需要接受并计划这样一个事实,即现在对于1-6期应该做什么是不明确的,因为他们将有不完整的数据。我不能从你的公式中弄清楚当你有两个以上的滞后期时,人们如何估计只有两个参数,除非你对磨损现象应用一些特定的形状......线性也许......你没说。
dfrm <- data.frame(y=rnorm(20), x=rnorm(20) )
dfrm$embx<- matrix(NA, ncol=7, nrow=20)
dfrm$embx[7:20, ] <- embed(dfrm$x, 7) * rep( (7:1)/7, each=14)
lm( y[7:20] ~ embx[7:20,], data=dfrm )
Call:
lm(formula = y[7:20] ~ embx[7:20, ], data = dfrm)
Coefficients:
(Intercept) embx[7:20, ]1 embx[7:20, ]2 embx[7:20, ]3 embx[7:20, ]4 embx[7:20, ]5
0.3065 -0.2371 0.9504 0.8601 0.5484 0.6621
embx[7:20, ]6 embx[7:20, ]7
1.1619 4.8338
对于x_(t-7),使用“全强度”x_t和低至1/7强度的因子。这与你的公式所表达的有点不同,因为它没有x_t协变量,但你应该能够从估计的系数构造一个“斜率”。