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



让我们考虑以下数据:

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'))
}

错误occrus:

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包(v0.3.0(创建于2020-12-08

最新更新