Stata と R の weight(s) オプション
本記事の目的
この記事では、データ分析を行う際に考慮するウエイト(weight)について整理します。基本的には回帰分析を想定しており、後半では単回帰分析の例もとに、 Stata と R の結果を比較しています。説明は Dupraz (2013) を参考にしました。色々と省略している箇所もあるので、詳細は必要に応じて元論文をご覧ください。
*weight
オプション
Stata で選択可能な 4 つの Stata には 4 つの weight オプションがあります。
-
fweight
: frequency weights -
aweight
: analytic weights -
pweight
: probability weights -
iweight
: importance weights
(iweight
は特殊なオプションとのことで、この記事ではそれ以外の 3 つを扱います)
各ウエイトの説明
結論、どのオプションでも点推定値には違いがありません。異なるのは推定値の標準誤差です。
fweight
fweight
が想定するのは、1 つのデータセットに重複したデータが入っているようなケースです。例えば、以下のケースでは
fweight
で推定した回帰係数の分散共分散行列は以下のとおりです。
aweight
ここでは以下のモデルを推定することを想定します。
上述のとおり、このモデルを aweight
で推定すると点推定値は fweight
と一致します。異なるのは標準誤差で、分散共分散行列は以下の式で表されます。ここでの
pweight
pweight
は母集団からの抽出確率を反映するウエイトです。参考にした論文の例では、都市圏と地方の調査対象者がおり、都市圏では 2 人に 1 人が、地方では 10 人に 1 人が抽出された状況が想定されています。この場合、都市圏では 1 人の対象者が 2 人分の、地方では 10 人分の重みもちます。この重みを考慮しない分析を行うと、分析結果に都市圏の意見が実態より大きく反映されることになります。
pweight
で実行した結果も回帰係数の点推定値は aweight
、fweight
と同じですが、ここでもやはり標準誤差の結果が異なります。pweight
の標準誤差は以下のとおりです(Sandwich Estimater)。
データで再現
aweight
と pweight
を使って実際に分析してみます。
扱うデータ
PISA 2018(OECD による生徒の学習到達度調査)のデータセットを PISA 2018 Database から取得し、dat_pisa
というデータを作成しています。
扱った変数はデータセットのうちの一部で、数学的リテラシー、読解力、生徒のウエイトです。ウエイト(W_FSTUWT
)を考慮し、読解力(PV1READ
)を独立変数、数学的リテラシー(PV1MATH
)を従属変数として回帰分析を行います。
> dat_pisa %>% head()
# A tibble: 6 × 3
PV1MATH PV1READ W_FSTUWT
<dbl> <dbl> <dbl>
1 704. 705. 166.
2 581. 570. 166.
3 692. 648. 166.
4 628. 672. 166.
5 682. 672. 166.
6 784. 770. 166.
Stata
aweight
と pweight
で回帰係数(Coefficient)の値が一致していることがわかります。一方、標準誤差(Std. err.)の値は pweight
の方が大きくなっています。論文では aweight
かつ robust standard error(ロバスト標準誤差)を実行することで pweight
の結果と一致すると記載がありましたので、そちらも試しています。
aweight
実行コードはこちら。
reg pv1math pv1read [aweight=w_fstuwt]
結果はこちら。
. reg pv1math pv1read [aweight=w_fstuwt]
(sum of wgt is 1,078,921.3259125)
------------------------------------------------------------------------------
pv1math | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
pv1read | .7102128 .006849 103.70 0.000 .6967865 .7236392
_cons | 171.1731 3.510538 48.76 0.000 164.2912 178.0549
------------------------------------------------------------------------------
pweight
実行コードはこちら。
reg pv1math pv1read [pweight=w_fstuwt]
結果はこちら。
. reg pv1math pv1read [pweight=w_fstuwt]
------------------------------------------------------------------------------
| Robust
pv1math | Coefficient std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
pv1read | .7102128 .007116 99.81 0.000 .696263 .7241627
_cons | 171.1731 3.714015 46.09 0.000 163.8923 178.4538
------------------------------------------------------------------------------
aweight + robust standard error
実行コードはこちら。
reg pv1math pv1read [aweight=w_fstuwt], vce(robust)
結果はこちら。
. reg pv1math pv1read [aweight=w_fstuwt], vce(robust)
(sum of wgt is 1,078,921.3259125)
------------------------------------------------------------------------------
| Robust
pv1math | Coefficient std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
pv1read | .7102128 .007116 99.81 0.000 .696263 .7241627
_cons | 171.1731 3.714015 46.09 0.000 163.8923 178.4538
------------------------------------------------------------------------------
R
R では lm
関数で weights
という引数を設定できます。W_FSTUWT
を指定して分析すると結果は以下のとおりです。Stata で aweight
を指定したときと同じ結果になっています。
実行コードはこちら。
model_pisa <- dat_pisa %>%
lm(data = .,
formula = PV1MATH ~ PV1READ, weights = W_FSTUWT)
summary(model_pisa)
結果はこちら(一部省略)。
Coefficients:
Estimate Std. Error t value Pr(>|t|)
PV1READ 0.710213 0.006849 103.70 <2e-16 ***
(Intercept) 171.173051 3.510538 48.76 <2e-16 ***
{lmtest}
パッケージを使うとロバスト標準誤差が計算できます。 Replicating Stata's "robust" option in R を見ると、type
引数で HC1
を設定すると Stata の結果と一致するようです。
実行コードはこちら。
lmtest::coeftest(x = model_pisa, vcov. = vcovHC, type = "HC1")
結果はこちら。pweight
の結果と一致しています。
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
PV1READ 0.710213 0.007116 99.805 < 2.2e-16 ***
(Intercept) 171.173051 3.714015 46.088 < 2.2e-16 ***
今後
今回は従属変数が連続変数のケースを扱いましたが、2 値のケースも書くかもしれません。
参考
Dupraz, Y. (2013). Using weights in Stata. Accessed on August.
Discussion