Я понимаю, что 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
#> ------------------------------------------------------------------------------
При моем реальном использовании не все наблюдения будут иметь одинаковый вес. Я просто сделал это здесь для простоты демонстрации.