Cómo trazar los efectos de interacción de conjuntos de datos extremadamente grandes (especialmente de la salida de rxGlm)

Soy informática actualglm modela un gran conjunto de datos. Ambosglm e inclusospeedglm Toma días calcular.

Actualmente tengo alrededor de 3 millones de observaciones y un total de 400 variables, solo algunas de las cuales se usan para la regresión. En mi regresión, uso 4 variables independientes enteras (iv1, iv2, iv3, iv4), 1 variable independiente binaria como factor (iv5), el término de interacción (x * y, dóndex es un entero yy es una variable ficticia binaria como factor). Finalmente, tengo efectos fijos a lo largo de los años.ff1 y identificadores de empresaff2. Tengo 15 años y 3000 empresas. He introducido los efectos fijos agregándolos como factores. Observo que especialmente los 3000 efectos fijos de la compañía hacen que el cálculo sea muy lento enstats glm y tambiénspeedglm.

Por lo tanto, decidí probar Microsoft R'srxGlm (RevoScaleR), ya que esto puede abordar más subprocesos y núcleos de procesador. De hecho, la velocidad de análisis es mucho más rápida. Además, comparé los resultados de una submuestra con el estándarglm y coincidieron.

Usé la siguiente función:

mod1 <- rxGlm(formula = dv ~ 
                      iv1 + iv2 + iv3+ 
                      iv4 + iv5 +
                      x * y +
                      ff1  + ff2,
                    family = binomial(link = "probit"), data = dat,
                    dropFirst = TRUE, dropMain = FALSE, covCoef = TRUE, cube = FALSE)

Sin embargo, estoy enfrentando un problema al intentar trazar el término de interacción usando eleffects paquete. Al llamar a la siguiente función, recibo el siguiente error:

> plot(effect("x*y", mod1))
Error in terms.default(model) : no terms component nor attribute

Supongo que el problema es querxGlm no almacena los datos necesarios para trazar la interacción. Creo que sí porque elrxGlm el objeto es mucho más pequeño que elglm expulsar, por lo tanto, es probable que contenga menos datos (80 MB frente a varios GB).

Ahora intenté convertir elrxGlm oponerse aglm víaas.glm(). Aún así, eleffects() la llamada no produce un resultado y genera los siguientes mensajes de error:

Error in dnorm(eta) : 
  Non-numerical argument for mathematical function
In addition: Warning messages:
1: In model.matrix.default(mod, data = list(dv = c(1L, 2L,  :
  variable 'x for y' is absent, its contrast will be ignored

Si ahora comparo una glm original con la "glm convertida", encuentro que la glm convertida contiene muchos menos artículos. Por ejemplo, no contieneeffects y para contrastes solo dicecontr.treatment para cada variable

Ahora estoy buscando principalmente una forma de transponer elrxGlm objeto de salida en un formato para que pueda usar si con eleffect() función. Si no hay forma de hacerlo, ¿cómo puedo obtener un diagrama de interacción utilizando funciones dentro deRevoScaleR paquete, por ejemplo,rxLinePlot()? rxLinePlot() también traza razonablemente rápido, sin embargo, todavía no he encontrado una manera de obtener tramas típicas de efectos de interacción. Quiero evitar primero calcular el totalglm modelar y luego trazar porque esto lleva mucho tiempo.

Respuestas a la pregunta(0)

Su respuesta a la pregunta