Весовые коэффициенты дробной частоты в лм R () - PullRequest
2 голосов
/ 18 апреля 2019

Я понимаю, что lm трактует weights как "аналитические" веса, что означает, что наблюдения просто взвешиваются друг против друга (например, lm будет взвешивать наблюдение с weight = 2 в два раза больше, чем с weight = 1), а общая N для модели не изменяется. Веса «частоты», с другой стороны, позволили бы модели иметь N, отличное от фактического числа наблюдений в данных.

Люди спрашивали о частотах в R до , но, насколько я могу судить, предыдущие вопросы касались данных опроса. Я не использую данные опроса для этого вопроса.

Я хотел бы реализовать весовые коэффициенты частоты, которые меньше 1, и которые приводят к тому, что N модели будет меньше, чем фактическое количество строк в данных. Например, если nrow(df) = 8 и все наблюдения имеют weight = 0,5, модель N должна равняться 4, и стандартные ошибки должны отражать эту разницу. Насколько я могу судить, веса для базовых R lm не могут быть использованы таким образом:

library(tidyverse)
library(broom)

df.unweighted <- tribble(
  ~x, ~y, ~w,
  0, 10, 1,
  0, 20, 1,
  1, 40, 1,
  1, 50, 1,
) %>%
  bind_rows(., .) # make twice as large

df.weighted <- df.unweighted %>%
  mutate(w = 0.5)

lm(data=df.unweighted, y~x, weights=w) %>%
  tidy
#> # A tibble: 2 x 5
#>   term        estimate std.error statistic  p.value
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#> 1 (Intercept)      15.      2.89      5.20 0.00202 
#> 2 x                30       4.08      7.35 0.000325

lm(data=df.weighted, y~x, weights=w) %>%
  tidy
#> # A tibble: 2 x 5
#>   term        estimate std.error statistic  p.value
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#> 1 (Intercept)     15.       2.89      5.20 0.00202 
#> 2 x               30.0      4.08      7.35 0.000325

# identical

То, что я ищу, может быть достигнуто в stata с помощью iweights. Обратите внимание на модель N и стандартные ошибки:

library(RStata)
stata("reg y x [iweight=w]",
      data.in = df.weighted)
#> . reg y x [iweight=w]
#> 
#>       Source |       SS       df       MS              Number of obs =       4
#> -------------+------------------------------           F(  1,     2) =   18.00
#>        Model |         900     1         900           Prob > F      =  0.0513
#>     Residual |         100     2          50           R-squared     =  0.9000
#> -------------+------------------------------           Adj R-squared =  0.8500
#>        Total |        1000     3  333.333333           Root MSE      =  7.0711
#> 
#> ------------------------------------------------------------------------------
#>            y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
#> -------------+----------------------------------------------------------------
#>            x |         30   7.071068     4.24   0.051    -.4243492    60.42435
#>        _cons |         15          5     3.00   0.095    -6.513264    36.51326
#> ------------------------------------------------------------------------------

При моем реальном использовании не все наблюдения будут иметь одинаковый вес. Я просто сделал это здесь для простоты демонстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...