我想创建一个函数,该函数将执行面板回归,其中包含3级虚拟对象。
让我们在模型内考虑时间效应:
library(plm)
fit_panel_lr <- function(y, x) {
x[, length(x) + 1] <- y
#adding dummies
mtx <- matrix(0, nrow = nrow(x), ncol = 3)
mtx[cbind(seq_len(nrow(mtx)), 1 + (as.integer(unlist(x[, 2])) - min(as.integer(unlist(x[, 2])))) %% 3)] <- 1
colnames(mtx) <- paste0("dummy_", 1:3)
#converting to pdataframe and adding dummy variables
x <- pdata.frame(x)
x <- cbind(x, mtx)
#performing panel regression
varnames <- names(x)[3:(length(x))]
varnames <- varnames[!(varnames == names(y))]
form <- paste0(varnames, collapse = "+")
x_copy <- data.frame(x)
form <- as.formula(paste0(names(y), "~", form,'-1'))
params <- list(
formula = form, data = x_copy, model = "within",
effect = "time"
)
pglm_env <- list2env(params, envir = new.env())
model_plm <- do.call("plm", params, envir = pglm_env)
model_plm
}
但是,如果我使用数据:
data("EmplUK", package="plm")
dep_var<-EmplUK['capital']
df1<-EmplUK[-6]
在输出中,我将得到:
> fit_panel_lr(dep_var, df1)
Model Formula: capital ~ sector + emp + wage + output + dummy_1 + dummy_2 +
dummy_3 - 1
<environment: 0x000001ff7d92a3c8>
Coefficients:
sector emp wage output
-0.055179 0.328922 0.102250 -0.002912
为什么公式中会考虑假人,而系数中却没有?有什么合理的解释吗?或者我做错了什么?
您在输出中看不到假人的一点是,在固定效果时间变换后,它们与其他数据线性相关。它们被丢弃,因此可以估计的是估计和输出。
在下面找到一些(不容易执行(代码,从上面的例子中提取:
dat <- cbind(EmplUK, mtx) # mtx being the dummy matrix constructed in your question's code for this data set
pdat <- pdata.frame(dat)
rhs <- paste(c("emp", "wage", "output", "dummy_1", "dummy_2", "dummy_3"), collapse = "+")
form <- paste("capital ~" , rhs)
form <- formula(form)
mod <- plm(form, data = pdat, model = "within", effect = "time")
detect.lindep(mod$model) # before FE time transformation (original data) -> nothing offending
detect.lindep(model.matrix(mod)) # after FE time transformation -> dummies are offending
detect.lindep
的帮助页面(?detect.lindep
包含在包plm
中(有一些关于有限元变换前后线性相关性的更好的例子。
建议:至于构造伪变量,我建议使用三个级别的R因子,而不是自己构造伪矩阵。使用因子通常更方便,也不容易出错。它通过使用model.frame/model.matrix框架的典型估计函数转换为二进制虚设(处理方式(。