【问题标题】:How do you retrieve the estimation sample in R?你如何检索 R 中的估计样本?
【发布时间】:2021-06-09 14:00:32
【问题描述】:

我想从模型对象中获取估计样本,即由于缺失值而未丢弃的观察值。对于标准的lm 回归(使用case.names()),这似乎很简单,但对于fixest 等较新的软件包来说,情况就不那么简单了。

是否有任何通用方法可以访问估计样本,而与用于估计的包无关?

我对@9​​87654325@ 和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-06-09 创建

【问题讨论】:

    标签: r regression


    【解决方案1】:

    通用函数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
    

    【讨论】:

    • 因此,换句话说,不可能有一个函数可以提取估计样本而与模型类无关,因为每个对象类都可以任意构造。为了使 case.names 等泛型适用于给定的模型类,我要么必须在自己的环境中定义它,要么要求类的开发人员在他的包中包含该方法?
    • @dufei 是的,就是这样。 case.names 位于基础包stats 中,R 核心团队无法猜测每个包开发人员将如何构建其建模函数的返回值。由他们来编写方法。如果您联系maintainer("fixest"),您(和所有其他人)可能会在下一个软件包版本中获得它。
    猜你喜欢
    • 2023-04-01
    • 2018-07-09
    • 2019-09-20
    • 1970-01-01
    • 2021-05-08
    • 2021-08-07
    • 2015-08-18
    • 2015-11-08
    • 2022-06-14
    相关资源
    最近更新 更多