Ajuste de un coeficiente de tiempo variable DLM

9

Quiero ajustar un DLM con coeficientes variables en el tiempo, es decir, una extensión de la regresión lineal habitual,

yt=θ1+θ2x2 .

Tengo un predictor ( ) y una variable de respuesta ( ), capturas anuales de peces marinos y continentales, respectivamente, de 1950 a 2011. Quiero que siga el modelo de regresión DLM,y tx2yt

yt=θt,1+θt,2xt

donde la ecuación de evolución del sistema es

θt=Gtθt1

de la página 43 de Modelos lineales dinámicos con R de Petris et al.

Un poco de codificación aquí,

fishdata <- read.csv("http://dl.dropbox.com/s/4w0utkqdhqribl4/fishdata.csv", header=T)
x <- fishdata$marinefao
    y <- fishdata$inlandfao

lmodel <- lm(y ~ x)
summary(lmodel)
plot(x, y)
abline(lmodel)

Claramente, los coeficientes variables en el tiempo del modelo de regresión son más apropiados aquí. Sigo su ejemplo de las páginas 121-125 y quiero aplicar esto a mis propios datos. Esta es la codificación del ejemplo.

############ PAGE 123
require(dlm)

capm <- read.table("http://shazam.econ.ubc.ca/intro/P.txt", header=T)
capm.ts <- ts(capm, start = c(1978, 1), frequency = 12)
colnames(capm)
plot(capm.ts)
IBM <- capm.ts[, "IBM"]  - capm.ts[, "RKFREE"]
x <- capm.ts[, "MARKET"] - capm.ts[, "RKFREE"]
x
plot(x)
outLM <- lm(IBM ~ x)
outLM$coef
    acf(outLM$res)
qqnorm(outLM$res)
    sig <- var(outLM$res)
sig

mod <- dlmModReg(x,dV = sig, m0 = c(0, 1.5), C0 = diag(c(1e+07, 1)))
outF <- dlmFilter(IBM, mod)
outF$m
    plot(outF$m)
outF$m[ 1 + length(IBM), ]

########## PAGES 124-125
buildCapm <- function(u){
  dlmModReg(x, dV = exp(u[1]), dW = exp(u[2:3]))
}

outMLE <- dlmMLE(IBM, parm = rep(0,3), buildCapm)
exp(outMLE$par)
    outMLE
    outMLE$value
mod <- buildCapm(outMLE$par)
    outS <- dlmSmooth(IBM, mod)
    plot(dropFirst(outS$s))
outS$s

Quiero poder trazar las estimaciones de suavizado plot(dropFirst(outS$s))para mis propios datos, que tengo problemas para ejecutar.

ACTUALIZAR

Ahora puedo producir estos gráficos, pero no creo que sean correctos.

fishdata <- read.csv("http://dl.dropbox.com/s/4w0utkqdhqribl4/fishdata.csv", header=T)
x <- as.numeric(fishdata$marinefao)
    y <- as.numeric(fishdata$inlandfao)
xts <- ts(x, start=c(1950,1), frequency=1)
xts
yts <- ts(y, start=c(1950,1), frequency=1)
yts

lmodel <- lm(yts ~ xts)
#################################################
require(dlm)
    buildCapm <- function(u){
  dlmModReg(xts, dV = exp(u[1]), dW = exp(u[2:3]))
}

outMLE <- dlmMLE(yts, parm = rep(0,3), buildCapm)
exp(outMLE$par)
        outMLE$value
mod <- buildCapm(outMLE$par)
        outS <- dlmSmooth(yts, mod)
        plot(dropFirst(outS$s))

> summary(outS$s); lmodel$coef
       V1              V2       
 Min.   :87.67   Min.   :1.445  
 1st Qu.:87.67   1st Qu.:1.924  
 Median :87.67   Median :3.803  
 Mean   :87.67   Mean   :4.084  
 3rd Qu.:87.67   3rd Qu.:6.244  
 Max.   :87.67   Max.   :7.853  
 (Intercept)          xts 
273858.30308      1.22505 

La estimación de suavizado de intersección (V1) está lejos del coeficiente de regresión lm. Supongo que deberían estar más cerca el uno del otro.

hgeop
fuente

Respuestas:

2

¿Cuál es exactamente tu problema?

La única trampa que encontré es que, aparentemente,

fishdata <- read.csv("http://dl.dropbox.com/s/4w0utkqdhqribl4,
                     fishdata.csv", header=T)

lee datos como enteros. Tuve que convertirlos en flotador,

x <- as.numeric(fishdata$marinefao)
y <- as.numeric(fishdata$inlandfao)

antes de que pudiera invocar las funciones dlm *.

F. Tusell
fuente
Gracias por tus sugerencias @F. Tusell He actualizado mi pregunta. Las estimaciones de suavizado producidas no están cerca de las lmodel$coefestimaciones. Supongo que las tramas son incorrectas, pero podría estar equivocado.
hgeop
1
No hay ninguna razón para esperar que las estimaciones suavizadas de pendiente e intersección estén cerca de las betas fijas en la regresión lineal. En particular, la pendiente debería fluctuar enormemente.
F. Tusell