4 votos

Cómo ajustar un glm de Poisson en R cuando los parámetros no están separados

Estoy tratando de ajustar un GLM de Poisson a los datos de conteo.

Donde el recuento $N_r$ para el tiempo $t_r$ se supone que sigue $\mathrm{ Poisson} (\lambda (t_r - t_0)^{-\alpha} e^{-\beta t_r})$ .

Aquí $r$ es discreto y observamos $N_r$ y $t_r$ para $r$ de 1 a 30. Los parámetros que quiero ajustar son $\lambda, \alpha, \beta, t_0 $ . Intuitivamente estoy tratando de ver en qué forma los recuentos $N_r$ disminuyen a medida que el tiempo $t_r$ aumenta.

En R, puedo ajustar el modelo de la siguiente manera en ausencia de $t_0$ (esto no es lo que quería hacer, sino lo que he podido hacer) como sigue.
$$ model1 = glm(N_r \sim t_r + \log(t_r), family = poisson()) $$ Desde entonces, $\log(E(N_r))$ es una combinación lineal $\log(\lambda)$ , $t_r$ y $\log(t_r)$ .

Los resultados del modelo1 son razonables.

Sin embargo, estoy teniendo dificultades al tratar de incluir el $t_0$ en la ecuación de mi modelo. Me gustaría ajustar un modelo que estimara los parámetros $\lambda, \alpha, \beta, t_0 $ . ¿Cómo puedo hacer esto en R? Es confuso para mí porque parece que, $$ \log(E(N_r)) = \log(\lambda) - \beta t_r - \alpha \log(t_r - t_0)$$ Así que $\alpha$ y $t_0$ no están separados. (¿Tal vez tenga que utilizar una función diferente?) Sería estupendo obtener alguna información sobre cómo ajustar este modelo.

3voto

jldugger Puntos 7490

A menos que tenga la combinación adecuada de $\alpha$ , $\beta$ y los valores de $x_i$ Puede que sea imposible precisar el valor de $t_0$ . El problema es que estas curvas pueden ser difíciles de distinguir.

Para obtener un ajuste, considerar la búsqueda sobre un conjunto razonable de valores de $t_0$ . Para cada valor, el problema es un Modelo Lineal Generalizado de Poisson estándar, por lo que se puede ajustar de forma rutinaria. Extraiga una medida del ajuste, como la desviación (o medidas equivalentes AIC y BIC). Un valor "plausible" de $t_0$ es cualquiera cuyo ajuste no sea mucho mayor que el valor con menor desviación. Un buen umbral de corte para utilizar la diferencia es el doble del percentil superior de la distribución chi-cuadrado con 1 grado de libertad. El rango de valores resultantes de $t_0$ es un intervalo de confianza para $t_0$ .

Al elegir las unidades de medida adecuadas para $t_r$ (que llamaré simplemente $t$ ), podemos suponer que los valores muestrales de $t$ oscilan entre $0$ a $1$ . Esto facilita la comparación de los modelos y da $t_0$ un significado inherente. Por ejemplo, $t_0\approx -1$ es bastante grande porque es comparable a toda la gama del $t$ . Limitaremos nuestra búsqueda a los valores negativos de $t_0$ porque el modelo no tiene sentido cuando $t_0$ es igual o superior al más pequeño $t$ en el conjunto de datos.

He aquí un ejemplo generado a partir del modelo con $\log(\lambda)=0$ , $\alpha=2$ , $\beta=1/3$ y $t.0 = -1/10$ con $30$ $t$ valores igualmente espaciados a lo largo de su rango, como se describe en la pregunta.

Figure 1: data and true model

He buscado una serie de $t.0$ valores geométricamente espaciados de $-0.01$ a $-3$ . Aquí está el gráfico de cómo varía la desviación:

! Figure 2: Deviance vs. t_0

Puntos dentro de la mitad del percentil 95 de $\chi^2(1)$ (igual a $1.92$ ) se indican como "significativos". Los valores correspondientes de $t_0$ van desde $-0.022$ a $-0.37$ . Un rango tan estrecho de estimaciones es raro En muchos casos, la desviación apenas cambiará, independientemente del valor que se dé a $t_0$ .

La siguiente figura ayuda a mostrar por qué las estimaciones de $t_0$ puede variar tanto. Para cada uno de los valores "significativos" de $t_0$ en la búsqueda, trazo la curva correspondiente al ajuste GLM de $\alpha$ , $\beta$ y $\log(\lambda)$ . Puedes ver que las curvas apenas varían:

Figure 3: Plausible fits

Son los que más varían en los valores bajos de $t$ . Esta es una información valiosa. Indica que si se pudiera elegir qué valores de $t$ para medir, debe concentrar muchos de ellos en valores pequeños. Como ejemplo, he creado un conjunto de datos en el que $t$ fue muestreado en $6$ valores espaciados geométricamente de $0.007$ a $1$ . Cada uno de estos valores fue medido $5$ veces de forma independiente, produciendo otro conjunto de datos de $30$ valores. Aquí están los ajustes plausibles junto con los datos:

! Figure 4: Plausible fits, alternative data

Casi no hay diferencias visibles entre ellos. El rango de valores plausibles de $t_0$ es notablemente más estrecho, lo que demuestra la mejora en la estimación que permite una mejor elección de los valores de $t$ a la muestra.

Para obtener intervalos de confianza para $\alpha$ , $\beta$ y $\log(\lambda)$ extraiga los intervalos de confianza del modelo GLM ajustado con $t_0$ se establece en el que tiene la menor desviación.

Los ajustes consiguen mantenerse iguales al reequilibrar los efectos de los otros parámetros como $t_0$ es variado. Utilizando de nuevo este primer conjunto de datos, he aquí cómo varían las estimaciones con $t_0$ (como $t_0$ a través de su $95\%$ intervalo de confianza: los valores "significativos" que se muestran en la segunda figura).

! Plots of coefficient estimates

(El verdadero valor de $t_0$ está marcado con una línea vertical).

Incluso si se restringen los modelos a valores no negativos de $\alpha$ y $\beta$ , todavía hay una gran variedad de $(\log(\lambda),\alpha,\beta,t_0)$ combinaciones de parámetros que producen casi el mismo ajuste.


Para quienes estén interesados en profundizar en este tema, aquí está la R código que produjo las cifras.

library(ggplot2)
#
# Specify the data-generation model.
#
lambda.log <- 0
t.0 <- -0.1
alpha <- 2
beta <- 1/3
size <- 0.95 # Percentile of chi-square(1) for deviance cutoff
# n <- 6
# x <- rep(exp(seq(-5, 0, length.out=n)), 5)
x <- seq(0, 1, length.out=30)
f <- function(x, theta) {
  exp(theta["lambda.log"] - log(x - theta["t.0"]) * theta["alpha"] - theta["beta"] * x)
}
theta <- c(lambda.log=lambda.log, alpha=alpha, beta=beta, t.0=t.0)
#
# Generate data.
#
set.seed(17)
X <- data.frame(x=x, y.hat=f(x, theta))
X$y <- with(X, rpois(length(x), y.hat))
#
# Generate a closely-spaced set of regressors for the purpose of plotting
# fits, etc.
3
x.0 <- seq(min(x), max(x), length.out=201)
X.0 <- data.frame(x=x.0, y.hat=f(x.0, theta))
#
# FIGURE 1: Data with the underlying model.
#
ggplot(X, aes(x,y)) + geom_path(aes(x,y.hat), X.0, size=1) + 
  geom_point(alpha=1/2, shape=21, fill="Black") + #geom_smooth() + 
  xlab("t") + 
  ggtitle("Data with True Curve")
#
# Search a range of values of t.0.
#
u <- -exp(seq(-5, 1, length.out=31))
fits <- lapply(u, function(u) glm(y ~ I(log(x-u)) + x, X, family="poisson"))
#
# Identify which values of t.0 are closest to achieving the best deviance.
#
deviance <- sapply(fits, function(x) x$deviance)
i <- which(deviance <= min(deviance) + qchisq(size, 1)/2)
#
# FIGURE 2: Deviance vs. t.0
#
D <- data.frame(t.0=u, deviance=deviance, 
                Significant=deviance <=  min(deviance) + qchisq(size, 1)/2)
ggplot(D, aes(x=t.0, y=deviance)) + 
  geom_line(size=1) + 
  geom_point(aes(color=Significant, shape=Significant), size=2) + 
  ggtitle("Deviance vs. t.0")
#
# FIGURE 3: Display plausible fits.
#
m <- length(i)
X.1 <- data.frame(t.0=rep(u[i], each=length(x.0)),
                  x = rep(x.0, m), 
                  y.hat=c(sapply(i, function(j) {
                    b <- c(lambda.log=1, alpha=-1, beta=-1) * fits[[j]]$coef
                    f(x.0, c(b, t.0=u[j]))})))
X.1$t.0 <- ordered(signif(X.1$t.0, 1))
ggplot(X.1, aes(x,y.hat)) + 
  geom_line(aes(color=t.0, group=t.0), size=1, alpha=1/2) + 
  geom_point(aes(x,y), X, alpha=1/2, shape=21, fill="Black") +
  xlab("t") + ylab("y") + 
  ggtitle("Plausible Fits For Varying t.0")
#
# FIGURE 4: Plot coefficients vs. t.0.
#
library(data.table)
a <- sapply(fits[i], coef)
A <- as.data.table(t(a))
names(A) <- c("lambda.log", "alpha", "beta")
A$t.0 <- u[i]
A <- rbind(A[, .(t.0, Estimate=lambda.log, Coefficient="log(lambda)")],
           A[, .(t.0, Estimate=-alpha, Coefficient="alpha")],
           A[, .(t.0, Estimate=-beta, Coefficient="beta")])
ggplot(A, aes(t.0, Estimate, group=Coefficient)) + 
  geom_vline(xintercept=t.0) +
  geom_line(aes(color=Coefficient), size=1) + 
  ggtitle("Coefficient Estimates")

0 votos

¿es posible tener el código fuente en R de este análisis? Muchas gracias.

1 votos

@Maximilian Ahora lo he publicado al final.

0 votos

¡gran código y explicación!

2voto

Björn Puntos 457

Incluso el modelo de código que has dado no hace lo que pareces decir que hace. Supone que $$\log \text{E} N_r = \beta_0 + \beta_1 t_r + \beta_2 \log t_r$$ y estimaciones $\beta_0$ , $\beta_1$ y $\beta_2$ que creo que no es lo que tenía en mente.

Es posible que tenga que utilizar algún software que le permita especificar transformaciones no lineales de los parámetros o que le permita especificar una probabilidad completamente definida por el usuario. Para esto último hay muchas opciones: por ejemplo, PROC NLMIXED en SAS, el paquete rstan de R con sus capacidades de máxima verosimilitud (o tal vez, si sus parámetros no están tan bien identificados, podría optar por el método bayesiano) y probablemente muchos otros paquetes.

0 votos

Gracias Bjorn, la ecuación que has escrito es la que tengo en mente (para el caso simple sin t cero). Excepto que habría un $\beta_0$ . Como dijo al entrar en el $t_0$ haría que el modelo lineal no funcionara. Intentaré buscar el paquete rstan que has mencionado.

0 votos

Ok. Voy a editar en el $\beta_0$ para mayor claridad.

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