1 votos

Paquete pdynmc en R | Problema de GMM

Soy estudiante y actualmente estoy trabajando en mi tesis de licenciatura. Y como se acerca el próximo plazo, espero que alguien pueda echarme una mano en mi constante problema:

Necesito estimar el siguiente modelo con el estimador GMM: Model to estimate

Hasta ahora estaba usando pgmm función en plm paquete. Puedes revisar otros temas míos con los problemas que he enfrentado y que aún no he resuelto.

Por lo tanto, traté de pasar a otro paquete pdynmc autorizado por el Dr. Markus Fritsch.

Aquí está una parte de mi conjunto de datos filtrados con empresas que tienen al menos 5 años de observaciones: https://drive.google.com/file/d/1dFUgXp8e1K0CdqMTpbtfviDq9vgJNOxW/view?usp=sharing

No estoy seguro de que pueda obtener un contexto de la misma, pero necesito estimar similar a este modelo como:

Un cambio o crecimiento en la variable dependiente de t a t+1 (TFPt+1) = instrumentos GMM, por lo que entendí, de la variable dependiente rezagada (así que cambio rezagado en la variable dependiente) (TFPt, y TFPt-1) + cambio en otra variable (Deuda), la medida de la variable necesaria (fricción financiera) + interacción entre las 2 últimas variables (fricción financiera * Deuda) + variables de control (edad de la empresa, tamaño de la empresa o log(TA), cambio en las ventas o Ventas).

En mi conjunto de datos, las variables necesarias son

  • ID - es una identificación de las empresas
  • Año - el año de observación
  • ta - Log de los activos totales
  • ff1-5 - variable de fricción financiera de las empresas
  • LVomegaACF_A - es una medida de la PTF
  • domegaACF_A - es la medida de la PTF
  • ddebt - Variable de la deuda
  • dsales - Variable de ventas
  • Edad - edad de las empresas

He intentado utilizar el paquete de la siguiente manera:

model <- pdynmc(dat = LVcheck, varname.i = "ID", varname.t = "Year",
                varname.y = "domegaACF_A", lagTerms.y = 2,
                fur.con = FALSE, varname.reg.fur = c("ddebt", "ff1", "Age", "ta", "dsales"),
                lagTerms.reg.fur = c(1,1,1,1,1),
                fur.con.diff = TRUE, fur.con.lev = FALSE,
                include.dum = TRUE, dum.diff = TRUE, dum.lev = FALSE, varname.dum = "Year",
                w.mat = "iid.err", std.err = "corrected", estimation = "onestep", opt.meth = "none",
                use.mc.nonlin = FALSE, use.mc.diff = TRUE, use.mc.lev = FALSE, include.y = TRUE)

Y el error que recibo:

Error in pdynmc(dat = LVData_A, varname.i = "ID", varname.t = "Year",  :
  Insufficient number of time periods to derive linear moment conditions.

La pregunta es la siguiente, ¿por qué el número de períodos es insuficiente si sólo se muestran las empresas que tienen al menos 5 años de observaciones? Y también, ¿está mi código escrito de acuerdo con la especificación de mi modelo, y todos los argumentos necesarios están escritos correctamente.

Agradecería mucho sus respuestas y cualquier apoyo por su parte. Aquí está la descripción del paquete https://rdrr.io/cran/pdynmc/man/pdynmc.html

A pesar de que todo está bastante detallado allí, sigo sin entender qué es lo que está mal en lo que estoy haciendo.

Muchas gracias de antemano.

0 votos

¿Qué tipo de variable es Año en su data.frame? Puede que esté codificada como numérica, en cuyo caso el mensaje de error tiene todo el sentido. Quizás intente escribir varname.t = "as.factor(Year)" o, si eso no funciona, intente establecer LVData_A $\$$ Año <- as.factor(LVData_A $\$$ Año) antes de ejecutar la estimación.

1 votos

@PedroCunha, Si lo hago, la variable Año pierde su sentido, y no muestra el año de observación, sino simplemente números consecuentes. Y aún así, el problema existe.

1voto

Isak Savo Puntos 15357

Me disculpo por mi comentario anterior; no tiene mucho sentido.

Al inspeccionar tus datos, he descubierto que hay identificaciones para las que sólo tienes observaciones de dos años. Las identificaciones problemáticas son: 9231, 24873, 24907, 78341, 78998, 90246, 92673, 92787 y 93846. Puede ver la tabla de frecuencias completa aquí .

Si miramos el código fuente del paquete, podemos ver qué es lo que hace que aparezca ese mensaje de error:

  if((use.mc.diff | use.mc.lev) && (length(unique(dat[, varname.t])) <
 3)){    

stop("Insufficient number of time periods to derive linear
     moment conditions.")  
}

que entiendo como: si la longitud del vector que contiene las fechas únicas es inferior a 3, no se puede calcular la estimación.

Mirando la ayuda del paquete, podemos ejecutar el código de ejemplo proporcionado:

## Load data from plm package 

    if(!requireNamespace("plm", quietly = TRUE)){ 

     stop("Dataset from package \"plm\" needed for this example. 
         Please install the package.", call. = FALSE) 
    } 

    else{  

    data(EmplUK,
         package = "plm")  dat <- EmplUK  dat[,c(4:7)] <- log(dat[,c(4:7)])

         ## Arellano and Bond (1991) estimation in Table 4, column (a1) 

     m1 <- pdynmc(dat = dat, varname.i = "firm", varname.t = "year",
                  use.mc.diff = TRUE, use.mc.lev = FALSE, use.mc.nonlin = FALSE,
                  include.y = TRUE, varname.y = "emp", lagTerms.y = 2,
                  fur.con = TRUE, fur.con.diff = TRUE, fur.con.lev = FALSE,
                  varname.reg.fur = c("wage", "capital", "output"), lagTerms.reg.fur = c(1,2,2),
                  include.dum = TRUE, dum.diff = TRUE, dum.lev = FALSE, varname.dum = "year",
                  w.mat = "iid.err", std.err = "corrected", estimation = "onestep",
                  opt.meth = "none")
  summary(m1)
    }

que funciona muy bien. Además, si ejecutamos el siguiente código:

length(unique(dat[, "year"]))

obtenemos como resultado 9, que es claramente mayor que 3. Sin embargo, si hacemos lo mismo con los datos que has proporcionado:

length(unique(datacheck[, "Year"]))

el resultado es 1, que es menor que 3, tal y como señalaba el mensaje de error.

No puedo entender por qué ocurre esto. Mi suposición es que tal vez necesita al menos 3 secuencias únicas de años o algo más, porque sí tiene suficientes observaciones con más de 3 años disponibles.

Aunque no es una respuesta definitiva, es demasiado larga para publicarla como comentario. De todos modos, espero que le sirva de ayuda.

EDITAR:

Código fuente

Viñeta

1 votos

Parece resolver el problema, creo. Gracias. Sin embargo, tengo otra pregunta. ¿Podría compartir el código fuente del paquete, ya que no fui capaz de encontrarlo? ¿Y hay algún lugar donde se indique que se pueden utilizar los términos de interacción?

0 votos

En cuanto a tu segunda pregunta, creo que es más probable que encuentres la respuesta en el archivo de ayuda del paquete. Añadiré ambos enlaces a mi respuesta.

1 votos

Gracias por la ayuda.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X