摘要中未包含假人
Dummies not included in summary
我想创建一个函数来执行包含 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因子,而不是自己构建虚拟矩阵。使用因子通常更方便且不易出错。它通过使用模型的典型估计函数转换为二元虚拟变量(处理方式)。frame/model.矩阵框架。
我想创建一个函数来执行包含 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因子,而不是自己构建虚拟矩阵。使用因子通常更方便且不易出错。它通过使用模型的典型估计函数转换为二元虚拟变量(处理方式)。frame/model.矩阵框架。