Stargazer with result from plm::pgmm() gives 'Error: Unrecognized object type.'

Stargazer with result from plm::pgmm() gives 'Error: Unrecognized object type.'

尽管据说 stargazer 可以处理由 plm::pgmm() 创建的对象(请参阅此处),但当 运行 以下代码时,我收到错误 Error: Unrecognized object type

require(pder)
require(plm)
require(stargazer)

data("DemocracyIncome", package = "pder")

abond_2step <- plm::pgmm(
  formula = democracy ~ lag(democracy) + lag(income) | lag(democracy, 2:99) | lag(income, 2),
  data = DemocracyIncome, subset = sample==1, index = c("country", "year"),
  model = "twostep", effect = "twoways")

stargazer::stargazer(abond_2step) # yields 'Error: Unrecognized object type'

我做错了什么还是 stargazer 不再支持 plm::pgmm() 创建的对象?我的session相关规范如下:

非常感谢您的帮助!

编辑:我发现在 pgmm 之前删除显式 plm:: 代码有效,但我不知道为什么:

abond_2step_alt <- pgmm( # removed plm::
  formula = democracy ~ lag(democracy) + lag(income) | lag(democracy, 2:99) | lag(income, 2),
  data = DemocracyIncome, subset = sample==1, index = c("country", "year"),
  model = "twostep", effect = "twoways")

stargazer::stargazer(abond_2step_alt) # This works!

回答

该程序包与 abond_2step$call[1] 进行字符串匹配。在你的情况下,那将是 plm::pgmm()。该包被硬编码为寻找 pgmm(),因此没有正确设置它。

另一个不起作用的代码示例

stargazer(stats::lm(Sepal.Length ~ ., iris))

理由

stargazer 写的很反常规。它在 stargazer::stargazer 中有很多函数定义,因此很难找到实际发生的事情。

在某个时候,调用了一个名为 .get.model.name 的函数,该函数又调用了 .model.identify,如下所示:

.model.identify <-
  function(object.name) {
    
    if (class(object.name)[1]=="NULL") {   #### !!!!! continue this
      return("NULL")
    }
    
    if (class(object.name)[1]=="Arima") {
      return("Arima")
    }
    
    if (class(object.name)[1]=="fGARCH") {
      return("fGARCH")
    }
    
    if (class(object.name)[1]=="censReg") {
      return("censReg")
    }
    
    if (class(object.name)[1]=="ergm") {
      return("ergm")
    }
.........

我们关心的代码:

else if (object.name$call[1]=="pgmm()") {
   return("pgmm")
}   

这也是问题所在:abond_2step$call[1] returns plm::pgmm()。这也正是您的替代调用有效的原因:abond_2step_alt$call[1] returns pgmm().