从加权和的滞后变量和估计R中的参数

时间:2013-04-01 06:30:48

标签: r optimization parameters lag estimation

我担心我会遇到估计问题。

我有两个变量,X和Y.Y由X的n个滞后值的加权和来解释。我的目标是估计两个参数c(alpha0,alpha1):

Yt =从j = 1到n的总和((alpha0 + alpha1 * j)* Xt-j)

enter image description here

其中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 

有人可以帮我解决这个问题吗?

1 个答案:

答案 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协变量,但你应该能够从估计的系数构造一个“斜率”。