手动创建的公式似乎不起作用...但是为什么呢?

Manually created formula seems to not work...but why?

让我们考虑以下数据:

library(pglm)
data('UnionWage', package = 'pglm')
df1 <- data.frame(UnionWage[1:2],'wage' = UnionWage$wage, 'exper' = UnionWage$exper)
head(df1)
  id year     wage exper
1 13 1980 1.197540     1
2 13 1981 1.853060     2
3 13 1982 1.344462     3
4 13 1983 1.433213     4
5 13 1984 1.568125     5
6 13 1985 1.699891     6 

我想编写一个函数来拟合数据的逻辑随机面板回归:

函数

fit_panel_binary <- function(y, x) {
   x <- cbind(x, y)
  #Taking varnames since 3 (first and second are respectively id and year)
  varnames <- names(x)[3:(length(x))]

  #Excluding dependent variable from varnames
  varnames <- varnames[!(varnames == names(y))]

  #Creating formula of independent variables (sum)
  form <- paste0(varnames, collapse = "+")
  x_copy <- data.frame(x)

  #Performing panel random regression
  model <- pglm(as.formula(paste0(names(y), "~", form)), data = as.matrix(x_copy), 
  model = 'random', family = binomial(link = 'logit'))
}

并且出现错误:

fit_panel_binary(UnionWage['union'],df1)
Error in if (!id.name %in% names(x)) stop(paste("variable ", id.name,  : 
  argument is of length zero 

虽然我输入的公式不正确,所以我将函数更改为输出公式 paste0(names(y), "~", form) 这就是我得到的:

"union~wage+exper"

看起来公式是正确的,但是回归说明了一些不同的东西。你知道问题出在哪里吗?

不幸的是,由于 pglm 使用非标准评估捕获其参数的方式,它不喜欢传递必须评估的公式(即未在原位键入的公式)。您可以通过使用 do.call 调用它来解决这个问题,但即使这样您也必须注意数据在调用 pglm 的框架中可用。所以你必须做这样的事情:

fit_panel_binary <- function(y, x) {

  x <- cbind(x, y)
  varnames <- names(x)[3:(length(x))]
  varnames <- varnames[!(varnames == names(y))]
  form     <- paste0(varnames, collapse = "+")
  x_copy   <- data.frame(x)
  form     <- as.formula(paste(names(y), "~", form))
  params   <- list(formula = form, data = x_copy, model = "random",
                   family  = binomial(link = "logit"))
  pglm_env <- list2env(params, envir = new.env())
  
  do.call("pglm", params, envir = pglm_env)
}

允许:

fit_panel_binary(UnionWage['union'], df1)
#> Maximum Likelihood estimation
#> Newton-Raphson maximisation, 6 iterations
#> Return code 1: gradient close to zero
#> Log-Likelihood: -1655.081 (4 free parameter(s))
#> Estimate(s): -3.428254 0.8305558 -0.06590541 4.2625

reprex package (v0.3.0)

于 2020-12-08 创建