Usando el método generalizado de momentos (GMM) para calcular el parámetro de regresión logística

13

Quiero calcular coeficientes para una regresión que es muy similar a la regresión logística (En realidad, regresión logística con otro coeficiente: cuandoApodría ser dada). Pensé en usar GMM para calcular los coeficientes, pero no estoy seguro de cuáles son las condiciones de momento que debería usar.

A1+e(b0+b1x1+b2x2+),
A

Alguien me puede ayudar con eso?

¡Gracias!

usuario5497
fuente
Cuando dice " podría ser dado", ¿quiere decir que lo especifica el usuario o el modelo lo estima? A
Macro
de cualquier manera. Puedo ponerlo como una entrada (por ejemplo, A = 0.25) o ser uno de los coeficientes que se encuentran
user5497
¿Varía de un sujeto a otro (es decir, son datos) o es una constante fija en todas las observaciones?
Macro
corregido en todas las observaciones (como b0, b1, ...)
user5497
2
¿Por qué no utilizar la máxima probabilidad en lugar de GMM?
Macro

Respuestas:

6

Suponiendo que , este modelo tiene la variable de respuesta de Bernoulli Y i conA1Yi

Pr(Yi=1)=A1+eXib,

donde (y posiblemente A , dependiendo de si se trata como una constante o un parámetro) son los coeficientes ajustados y X i son los datos para la observación i . Supongo que el término de intercepción se maneja agregando una variable con valor constante 1 a la matriz de datos.bAXii

Las condiciones del momento son:

E[(YiA1+eXib)Xi]=0.

Reemplazamos esto con la contraparte de muestra de la condición, suponiendo observaciones:N

m=1Ni=1N[(YiA1+eXib)Xi]=0

Esto se resuelve prácticamente minimizando en todos los posibles valores de coeficientes b (a continuación usaremos el simplex de Nelder-Mead para realizar esta optimización).metrometrosi

UN

dat <- as.matrix(cbind(data.frame(IsVersicolor = as.numeric(iris$Species == "versicolor"), Intercept=1), iris[,1:4]))
head(dat)
#      IsVersicolor Intercept Sepal.Length Sepal.Width Petal.Length Petal.Width
# [1,]            0         1          5.1         3.5          1.4         0.2
# [2,]            0         1          4.9         3.0          1.4         0.2
# [3,]            0         1          4.7         3.2          1.3         0.2
# [4,]            0         1          4.6         3.1          1.5         0.2
# [5,]            0         1          5.0         3.6          1.4         0.2
# [6,]            0         1          5.4         3.9          1.7         0.4

Estos son los coeficientes ajustados mediante regresión logística:

summary(glm(IsVersicolor~., data=as.data.frame(dat[,-2]), family="binomial"))
# Coefficients:
#              Estimate Std. Error z value Pr(>|z|)    
# (Intercept)    7.3785     2.4993   2.952 0.003155 ** 
# Sepal.Length  -0.2454     0.6496  -0.378 0.705634    
# Sepal.Width   -2.7966     0.7835  -3.569 0.000358 ***
# Petal.Length   1.3136     0.6838   1.921 0.054713 .  
# Petal.Width   -2.7783     1.1731  -2.368 0.017868 *  

(Yyo-UN1+mi-Xyosi)Xyo para cada observación yo:

moments <- function(b, X) {
  A <- 1
  as.vector(X[,1] - A / (1 + exp(-(X[,-1] %*% cbind(b))))) * X[,-1]
}

Ahora podemos ajustar coeficientes numéricamente si, utilizando los coeficientes de regresión lineal como un punto inicial conveniente (como se sugiere en el tutorial vinculado anteriormente):

init.coef <- lm(IsVersicolor~., data=as.data.frame(dat[,-2]))$coefficients
library(gmm)
fitted <- gmm(moments, x = dat, t0 = init.coef, type = "iterative", crit = 1e-19,
              wmatrix = "optimal", method = "Nelder-Mead",
              control = list(reltol = 1e-19, maxit = 20000))
fitted
#  (Intercept)  Sepal.Length   Sepal.Width  Petal.Length   Petal.Width  
#      7.37849      -0.24536      -2.79657       1.31364      -2.77834  
# 
# Convergence code =  0 

El código de convergencia de 0 indica que el procedimiento convergió, y los parámetros son idénticos a los devueltos por regresión logística.

Un vistazo rápido a la fuente del paquete gmm (funciones momentEstim.baseGmm.iterativey gmm:::.obj1los parámetros proporcionados) muestra que el paquete gmm está minimizandometrometrocomo se indicó anteriormente. El siguiente código equivalente llama a la optimfunción R directamente, realizando la misma optimización que logramos anteriormente con la llamada a gmm:

gmm.objective <- function(theta, x, momentFun) {
  avg.moment <- colMeans(momentFun(theta, x))
  sum(avg.moment^2)
}
optim(init.coef, gmm.objective, x=dat, momentFun=moments,
      control = list(reltol = 1e-19, maxit = 20000))$par
#  (Intercept) Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#    7.3784866   -0.2453567   -2.7965681    1.3136433   -2.7783439 
josliber
fuente