微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你如何在 R 中检索估计样本?

如何解决你如何在 R 中检索估计样本?

我想从模型对象中获取估计样本,即由于缺失值而未删除的观察值。这对于标准的 lm 回归(使用 case.names())来说似乎很简单,但对于诸如 fixest 之类的较新的软件包而言则不然。

是否有任何通用的方法来访问估计样本,而不管用于估计的包是什么?

我对 lmfixest 对象的尝试是:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。