“闭包”类型的对象不能用R中的pglm :: pglm函数进行子集化以估计面板logit

时间:2017-01-11 12:52:53

标签: r logistic-regression plm

我正在尝试使用pglm包中的pglm函数来获取有序逻辑模型的随机效果面板估算。

在测试独立函数pglm时,它会给出我想要的结果。这是我的规格:

pglm::pglm(as.numeric(y)~x1+x2+x3, df,family = pglm::ordinal('logit'), 
           model = "random", method = "bfgs", print.level = 3, R = 5, index = 'Year')

其中:  1.所有解释变量{x1,x2,x3}都是数字双精度数  2. y是一个有序的分类变量,范围从1到22

该表还包括1996年至2014年的“年”变量,用于构建面板数据。

尝试在另一个函数中使用pglm函数时:

pglm_fun <- function(df){

  df <- data.frame(df)
  pglm::pglm(as.numeric(y)~x1+x2+x3, data =  df,family = pglm::ordinal('logit'), 
               model = "random", method = "bfgs", print.level = 3, R = 5, index = 'Year')

}

我在计算

时收到错误消息
pdata.frame(data, index) 
  

x [,!na.check]中的错误:'closure'类型的对象不是子集表。

尝试在控制台中运行代码时,我没有这样的错误,pdata.frame()功能正常工作。

数据框示例:

df = data.frame(y    = sort(rep(1:4,20)),
       x1   = rnorm(80), 
       x2   = rnorm(80), 
       x3   = rnorm(80),
       Year = rep(sample(1995:1998, replace = FALSE),20))

1 个答案:

答案 0 :(得分:0)

好的,我明白了。在这种情况下,R中存在环境问题,因为我使用的函数是复制变量而不是直接使用全局变量。 通过在函数中声明单个名称并将数据框保留为全局变量来解决该问题:

pglm_fun1 <- function("y","x1","x2","x3","Year"){
  require("pglm")
  pglm(as.numeric(y)~x1+x2+x3, data = df, family = ordinal('logit'), 
          model = "random", method = "bfgs", print.level = 3, R = 5, index = 'Year')

}