有没有人有一个很好的干净方式来获取predict
模型的felm
行为?
library(lfe)
model1 <- lm(data = iris, Sepal.Length ~ Sepal.Width + Species)
predict(model1, newdata = data.frame(Sepal.Width = 3, Species = "virginica"))
# Works
model2 <- felm(data = iris, Sepal.Length ~ Sepal.Width | Species)
predict(model2, newdata = data.frame(Sepal.Width = 3, Species = "virginica"))
# Does not work
答案 0 :(得分:10)
作为解决方法,您可以合并cleaned_result = [str(i) for i in result]
,felm
和getfe
,如下所示:
demeanlist
您的想法是使用library(lfe)
lm.model <- lm(data=demeanlist(iris[, 1:2], list(iris$Species)), Sepal.Length ~ Sepal.Width)
fe <- getfe(felm(data = iris, Sepal.Length ~ Sepal.Width | Species))
predict(lm.model, newdata = data.frame(Sepal.Width = 3)) + fe$effect[fe$idx=="virginica"]
将变量置于中心,然后demeanlist
使用居中变量估算lm
上的系数,为您提供Sepal.Width
个对象你可以运行lm
。然后运行predict
+ felm
以获取固定效果的条件均值,并将其添加到getfe
的输出中。
答案 1 :(得分:5)
这可能不是您正在寻找的答案,但似乎作者没有向lfe
包添加任何功能,以便通过使用拟合{{1}来预测外部数据模型。主要焦点似乎是对群体固定效应的分析。但是,有趣的是,在包的文档中提到了以下内容:
该对象与'lm'对象有一些相似之处 为lm设计的后处理方法可能会起作用。有可能 但是有必要强迫对象成功。
因此,有可能将felm
对象强制转换为felm
对象,以获得一些额外的lm
功能(如果对象中存在所有必需的信息)执行必要的计算)。
lfe包旨在在非常大的数据集上运行,并且努力节省内存:作为直接结果,lm
对象不使用/包含qr分解,而不是felm
对象。不幸的是,lm
lm
过程依赖于此信息来计算预测。因此,强制predict
对象并执行预测方法将失败:
felm
如果您真的必须使用此软件包来执行预测,那么您可以使用> model2 <- felm(data = iris, Sepal.Length ~ Sepal.Width | Species)
> class(model2) <- c("lm","felm") # coerce to lm object
> predict(model2, newdata = data.frame(Sepal.Width = 3, Species = "virginica"))
Error in qr.lm(object) : lm object does not have a proper 'qr' component.
Rank zero or should not have used lm(.., qr=FALSE).
对象中提供的信息编写自己的此功能的简化版本。例如,OLS回归系数可通过felm
获得。
答案 2 :(得分:2)
这适用于您希望忽略预测中的组效果,预测新X,并且只需要置信区间的情况。它首先查找clustervcv
属性,然后查找robustvcv
,然后查找vcv
。
predict.felm <- function(object, newdata, se.fit = FALSE,
interval = "none",
level = 0.95){
if(missing(newdata)){
stop("predict.felm requires newdata and predicts for all group effects = 0.")
}
tt <- terms(object)
Terms <- delete.response(tt)
attr(Terms, "intercept") <- 0
m.mat <- model.matrix(Terms, data = newdata)
m.coef <- as.numeric(object$coef)
fit <- as.vector(m.mat %*% object$coef)
fit <- data.frame(fit = fit)
if(se.fit | interval != "none"){
if(!is.null(object$clustervcv)){
vcov_mat <- object$clustervcv
} else if (!is.null(object$robustvcv)) {
vcov_mat <- object$robustvcv
} else if (!is.null(object$vcv)){
vcov_mat <- object$vcv
} else {
stop("No vcv attached to felm object.")
}
se.fit_mat <- sqrt(diag(m.mat %*% vcov_mat %*% t(m.mat)))
}
if(interval == "confidence"){
t_val <- qt((1 - level) / 2 + level, df = object$df.residual)
fit$lwr <- fit$fit - t_val * se.fit_mat
fit$upr <- fit$fit + t_val * se.fit_mat
} else if (interval == "prediction"){
stop("interval = \"prediction\" not yet implemented")
}
if(se.fit){
return(list(fit=fit, se.fit=se.fit_mat))
} else {
return(fit)
}
}
答案 3 :(得分:1)
为了扩展pbaylis的答案,我创建了一个稍微冗长的函数,该函数很好地扩展了功能,以允许多个固定效果。请注意,您必须手动输入felm模型中使用的原始数据集。该函数返回一个包含以下两项的列表:预测的向量,以及一个基于new_data的数据帧,该数据帧包含预测和固定效果作为列。
predict_felm <- function(model, data, new_data) {
require(dplyr)
# Get the names of all the variables
y <- model$lhs
x <- rownames(model$beta)
fe <- names(model$fe)
# Demean according to fixed effects
data_demeaned <- demeanlist(data[c(y, x)],
as.list(data[fe]),
na.rm = T)
# Create formula for LM and run prediction
lm_formula <- as.formula(
paste(y, "~", paste(x, collapse = "+"))
)
lm_model <- lm(lm_formula, data = data_demeaned)
lm_predict <- predict(lm_model,
newdata = new_data)
# Collect coefficients for fe
fe_coeffs <- getfe(model) %>%
select(fixed_effect = effect, fe_type = fe, idx)
# For each fixed effect, merge estimated fixed effect back into new_data
new_data_merge <- new_data
for (i in fe) {
fe_i <- fe_coeffs %>% filter(fe_type == i)
by_cols <- c("idx")
names(by_cols) <- i
new_data_merge <- left_join(new_data_merge, fe_i, by = by_cols) %>%
select(-matches("^idx"))
}
if (length(lm_predict) != nrow(new_data_merge)) stop("unmatching number of rows")
# Sum all the fixed effects
all_fixed_effects <- base::rowSums(select(new_data_merge, matches("^fixed_effect")))
# Create dataframe with predictions
new_data_predict <- new_data_merge %>%
mutate(lm_predict = lm_predict,
felm_predict = all_fixed_effects + lm_predict)
return(list(predict = new_data_predict$felm_predict,
data = new_data_predict))
}
model2 <- felm(data = iris, Sepal.Length ~ Sepal.Width | Species)
predict_felm(model = model2, data = iris, new_data = data.frame(Sepal.Width = 3, Species = "virginica"))
# Returns prediction and data frame
答案 4 :(得分:1)
晚聚会,但新的最固定程序包(link)具有预测方法。它使用与lfe非常相似的语法来支持高维固定效果(和聚类等)。值得注意的是,对于我测试过的基准案例,它的运行速度比lfe快得多。
library(fixest)
model_feols <- feols(data = iris, Sepal.Length ~ Sepal.Width | Species)
predict(model_feols, newdata = data.frame(Sepal.Width = 3, Species = "virginica"))
# Works
答案 5 :(得分:-1)
我认为您正在寻找的可能是lme4
包。我能够使用这个预测工作:
library(lme4)
data(iris)
model2 <- lmer(data = iris, Sepal.Length ~ (Sepal.Width | Species))
predict(model2, newdata = data.frame(Sepal.Width = 3, Species = "virginica"))
1
6.610102
您可能需要玩一点来指定您正在寻找的特定效果,但该包已有详细记录,因此它应该不是问题。