9 votos

Ajuste de un DLM de coeficiente variable en el tiempo

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

$y_t = \theta_1 + \theta_2x_2$ .

Tengo un predictor ( $x_2$ ) y una variable de respuesta ( $y_t$ ), las capturas anuales de peces marinos y continentales, respectivamente, desde 1950 hasta 2011. Quiero que el modelo de regresión DLM siga,

$y_t = \theta_{t,1} + \theta_{t,2}x_t$

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

$\theta_t = G_t \theta_{t-1}$

de la página 43 de Dynamic Linear Models With R por 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)

Es evidente que los coeficientes variables en el tiempo del modelo de regresión son más apropiados en este caso. Sigo su ejemplo de las páginas 121 - 125 y quiero aplicarlo 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 ser capaz de trazar las estimaciones de suavizado plot(dropFirst(outS$s)) para mis propios datos, que estoy teniendo problemas para ejecutar.

ACTUALIZACIÓN

Ahora puedo producir estas parcelas pero no creo que sean correctas.

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 del suavizado del intercepto (V1) está lejos del coeficiente de regresión lm. Supongo que deberían estar más cerca el uno del otro.

2voto

Zolomon Puntos 250

¿Cuál es exactamente su problema?

El único escollo que he encontrado es que, aparentemente,

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

lee los datos como enteros. Tuve que convertirlos a float,

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

antes de poder invocar las funciones dlm*.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X