4 votos

Desbordamiento numérico multiestado con el paquete MSM en R

He tratado de utilizar el msm en R para modelar un modelo de 6 estados, multi-estado de una enfermedad. Mi conjunto de datos, en total, contiene unos 22.000 sujetos, con algo más de 81k observaciones.

Tuve un lote de problemas para preparar mis datos porque mis datos eran bastante desordenados. Sin embargo, ahora que mis datos están listos, cuando ejecuto el modelo obtengo un error de desbordamiento:

MD.msm <- msm( PatientState_num ~ Years, subject=IDNumber, data = MD_Death2, qmatrix = Q2.crude, deathexact = 6)

Error in Ccall.msm(params, do.what = "lik", ...) : 
  numerical overflow in calculating likelihood

No puedo encontrar ningún recurso que me ayude a diagnosticar lo que está causando el desbordamiento ni cómo podría corregirlo.

El consejo más cercano que puedo encontrar es el de la página 8 de Multi-State Models for Panel Data: The msm Package for R ( https://www.jstatsoft.org/article/view/v038i08 ) afirma:

Para facilitar la convergencia, se utiliza el algoritmo de optimización cuasi-Newton "BFGS (véase la documentación de la función de R optim()), y se aumenta el número máximo de iteraciones a 10000. La -2 log-likelihood también se divide por 4000, ya que toma valores alrededor de 4000 para rangos plausibles de los parámetros. Esto garantiza que optimización tiene lugar en una escala unitaria aproximada, para evitar desbordamiento o subdesbordamiento numérico

Sin embargo, si sólo utilizo esas opciones sigo obteniendo el error de desbordamiento.

¿Alguna sugerencia?

En caso de que necesites mirar los valores iniciales crudos para las intensidades de transición son:

Q2.crude <- crudeinits.msm(PatientState_num ~ Years, IDNumber, data=MD_Death2, qmatrix=transitions_allowed)

> Q2.crude
           1          2           3            4          5          6
1 -5.1078374  2.8763872  1.35671107  0.130212308  0.5666499 0.17787694
2  0.7587895 -2.4108875  0.05652063  0.583858120  0.9748396 0.03687971
3  1.0173350  1.2362397 -3.07569242  0.255661062  0.3328495 0.23360723
4  0.3807051  0.7235918  0.16135846 -1.265655417  0.0000000 0.00000000
5  0.7331575  0.4638941  0.21511807  0.004390165 -1.4941194 0.07755958
6  0.0000000  0.0000000  0.00000000  0.000000000  0.0000000 0.00000000

También si necesitas ver la tabla de estados:

statetable.msm(PatientState_num, IDNumber, data=MD_Death2)
    to
from     1     2     3     4     5     6
   1    73 10802  5095   489  2128   668
   2  5370 12681   400  4132  6899   261
   3  2491  3027  1331   626   815   572
   4   151   287    64     1     0     8
   5  1002   634   294     6   101   106

2voto

Yo he tenido el mismo problema. En mi caso lo resolví diferenciando primero el tiempo dentro de cada tema y tomando el valor mínimo. Eso se puede hacer con aggregate():

    diffs <- aggregate(cbind(minDiff=Years)~IDNumber, FUN=function(x) min(diff(x)),data=MD_Death2)

Si luego fusiona esto con sus datos, puede excluir fácilmente los sujetos en los que hay diferencias de tiempo muy pequeñas entre cada observación.

    MD_Death2 <- merge(sampleData,diffs,by='IDNumber',all.x=T)

En mi caso, tras excluir a los sujetos que tenían menos de 0,01 años entre dos observaciones (que en mi caso eran probables errores) se solucionó el problema. Si todavía no funciona, también puede intentar aumentar la opción fnscale más, (y las iteraciones máximas si es necesario), por ejemplo, pasar

    control=list(fnscale=5000,maxit=500)

a msm().

1voto

DroidDev Puntos 23

Es difícil abordar cuestiones de este tipo si no se tienen los datos necesarios para depurar el error específico (numérico o de otro tipo). Una alternativa que puedes considerar (y que puede ayudarte a entender mejor tus transiciones) es dividir la estimación en diferentes partes. Es un trabajo mucho más manual en comparación con la ejecución de una estimación simple en MSM, pero puede proporcionar información adicional a su análisis.

Así es como yo lo haría:

  1. Transforme sus datos en "formato largo", es decir, cada identificador aporta tantos tantos registros a su conjunto de datos como el número de intervalos de tiempo que se ha observado.
  2. Cree una variable categórica que represente los estados mutuamente excluyentes que ha descrito y una variable retardada que represente este valor de estado en el periodo anterior.
  3. Divida su conjunto de datos consolidados en 5 conjuntos de datos separados, basados en los 5 estados "desde" que tiene, según el valor de la variable de estado anterior. Cada observación en este subconjunto de datos tendrá el mismo valor para el estado anterior pero diferentes valores para el estado "a", a menos que estén censurados en cuyo caso no hay transición.
  4. Para cada uno de ellos, estimar una logística multinomial, o logísticas binarias separadas, siendo la variable dependiente la estado multicategoría "a" (o una sola categoría si se utiliza un logit binario). binario). En cualquier caso, el estado anterior se convierte en su categoría de referencia de referencia (por ejemplo, si Y es la variable dependiente, se establece en 0 con las categorías "a" son 0, 1, 2, 3, 4 o 0, 1 (caso binario, siendo 1 el estado "a" elegido)).
  5. Este marco le permitirá explorar y estimar otras posibles características de los datos, como la "dependencia de la duración" en función de los períodos. Si quiere explorar esto, también debería crear una variable "tiempo en el estado" que se ponga a 0 al principio de cada periodo para cada id en sus datos.
  6. Este marco también debería permitir la existencia de rachas "múltiples" en los datos, en las que un mismo identificador puede pasar de un estado a otro.
  7. Dado que algunos de sus estados son escasos, encontrará muchas advertencias sobre la separación perfecta, etc. En esos casos, puede empezar con un término constante y luego añadir variables basadas en alguna medida de los errores del modelo.
  8. Para que la tarea sea manejable y se reduzca la duplicación de código, se debe escribir una función que tome como entrada un estado desde y un estado hasta y dé salida a las estimaciones del MLG.
  9. También tiene a su disposición otras buenas herramientas como glmnet, validación cruzada, etc.

Siento no haber podido ayudarte con tu pregunta original, pero espero que esto te ayude a pensar en un camino a seguir para tu investigación.

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