从lfe包预测felm的方法

时间:2015-05-27 19:32:43

标签: r predict lfe

有没有人有一个很好的干净方式来获取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

6 个答案:

答案 0 :(得分:10)

作为解决方法,您可以合并cleaned_result = [str(i) for i in result] felmgetfe,如下所示:

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 

您可能需要玩一点来指定您正在寻找的特定效果,但该包已有详细记录,因此它应该不是问题。