问题描述
我想从模型对象中获取估计样本,即由于缺失值而未删除的观察值。这对于标准的 lm
回归(使用 case.names()
)来说似乎很简单,但对于诸如 fixest
之类的较新的软件包而言则不然。
是否有任何通用的方法来访问估计样本,而不管用于估计的包是什么?
我对 lm
和 fixest
对象的尝试是:
library(tidyverse)
library(insight)
library(fixest)
# create data with NA -----------------------------------------------------
dat <- mtcars %>%
as_tibble(rownames = "model") %>%
mutate(cyl = na_if(cyl,4))
# lm ----------------------------------------------------------------------
mod_lm <- lm(mpg ~ cyl * disp,data = dat)
obs <- as.integer(case.names(mod_lm))
dat %>%
filter(row_number() %in% obs)
#> # A tibble: 21 x 12
#> model mpg cyl disp hp drat wt qsec vs am gear carb
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 Mazda RX4 … 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 Hornet 4 D… 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 4 Hornet Spo… 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 5 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
#> 6 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
#> 7 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
#> 8 Merc 280C 17.8 6 168. 123 3.92 3.44 18.9 1 0 4 4
#> 9 Merc 450SE 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
#> 10 Merc 450SL 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
#> # … with 11 more rows
# fixest ------------------------------------------------------------------
mod_fe <- fixest::feols(mpg ~ cyl * disp,data = dat)
#> NOTE: 11 observations removed because of NA values (RHS: 11).
# does not work
case.names(mod_fe)
#> NULL
# remove missing values manually for all variables used in the regression
vars <- find_predictors(mod_fe,flatten = TRUE)
dat %>%
filter(if_all(
all_of(vars),~ !is.na(.x)
))
#> # A tibble: 21 x 12
#> model mpg cyl disp hp drat wt qsec vs am gear carb
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 Mazda RX4 … 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 Hornet 4 D… 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 4 Hornet Spo… 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 5 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
#> 6 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
#> 7 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
#> 8 Merc 280C 17.8 6 168. 123 3.92 3.44 18.9 1 0 4 4
#> 9 Merc 450SE 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
#> 10 Merc 450SL 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
#> # … with 11 more rows
由 reprex package (v2.0.0) 于 2021 年 6 月 9 日创建
解决方法
泛型函数 case.names
没有为类 "fixest"
的对象编写的方法。解决方案是查看 str(mod_fe)
并编写自己的方法。
case.names.fixest <- function(object,...){
no <- object$obsRemoved
seq_len(object$nobs_origin)[-no]
}
case.names(mod_fe)
# [1] 1 2 4 5 6 7 10 11 12 13 14 15 16 17 22 23 24 25 29 30 31