terror - método de predicción para felm del paquete lfe
peliculas de terror de estudiantes universitarios (4)
¿Alguien tiene una buena manera limpia de predict
comportamiento de los modelos de 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
Como solución alternativa, puede combinar felm
, getfe
y demeanlist
siguiente manera:
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"]
La idea es que utilice una demeanlist
de demeanlist
para centrar las variables, luego lm
para estimar el coeficiente en Sepal.Width
utilizando las variables centradas, lo que le da un objeto lm
sobre el que puede ejecutar predict
. Luego ejecute felm
+ getfe
para obtener la media condicional para el efecto fijo, y agregue eso a la salida de predict
.
Creo que lo que estás buscando podría ser el paquete lme4
. Pude obtener una predicción para trabajar usando esto:
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
Puede que tenga que jugar un poco para especificar los efectos particulares que está buscando, pero el paquete está bien documentado, por lo que no debería ser un problema.
Esto debería funcionar para los casos en los que desea ignorar los efectos de grupo en la predicción, predecir nuevas X y solo desea intervalos de confianza. Primero busca un atributo clustervcv
, luego robustvcv
, luego 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)
}
}
Puede que esta no sea la respuesta que está buscando, pero parece que el autor no agregó ninguna funcionalidad al paquete lfe
para hacer predicciones sobre datos externos mediante el uso del modelo felm
ajustado. El foco principal parece estar en el análisis de los efectos fijos del grupo. Sin embargo, es interesante observar que en la documentación del paquete se menciona lo siguiente:
El objeto tiene cierta semejanza con un objeto ''lm'', y es posible que algunos métodos de posprocesamiento diseñados para lm funcionen. Sin embargo, puede ser necesario coaccionar el objeto para tener éxito con esto.
Por lo tanto, podría ser posible forzar el objeto felm
a un objeto lm
para obtener alguna funcionalidad lm
adicional (si toda la información requerida está presente en el objeto para realizar los cálculos necesarios).
El paquete lfe está destinado a ejecutarse en conjuntos de datos muy grandes y se hizo un esfuerzo para conservar la memoria: como resultado directo de esto, el objeto felm
no usa / contiene una descomposición qr, a diferencia del objeto lm
. Desafortunadamente, el procedimiento de predict
lm
se basa en esta información para calcular las predicciones. Por lo tanto, coaccionar el objeto felm
y ejecutar el método de predicción fallará:
> 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).
Si realmente debe usar este paquete para realizar las predicciones, puede escribir su propia versión simplificada de esta funcionalidad utilizando la información que tiene disponible en el objeto felm
. Por ejemplo, los coeficientes de regresión OLS están disponibles a través model2$coefficients
.