[Stata][graph]Stataでのmarginsとmarginsplotの描き方

trees near ocean stata
Photo by Tom Fisk on Pexels.com

marginsとmarginsplot

https://www.stata.com/manuals/rmargins.pdf

https://www.stata.com/manuals/rmarginsplot.pdf

なんとなく使っていていつかまとめたいと思っていた。Stataはこちら。

統計解析ソフト Stata | ライトストーン
統計解析ソフトStataの紹介ページです。計量経済データ/臨床データなどの解析に利用できます。

margins

まずはmarginsから。marginsは、いくつかの共変量の「固定値」で事前に適合させたモデルの予測値から計算された統計量であり、残りの共変量について平均化またはその他の方法で積分をおこなう。このコマンドは、指定された共変量の値に対する応答のmarginsを推定し、結果を表として表示する。機能には、推定されたmarginsの平均、最小2乗平均、平均および条件付きmargins効果および部分効果(これは微分または弾力性として報告されることがある)、平均および条件付き修正予測値、予測marginsが含まれる。

ということであるが、ちょっとわかりにくいのでChatGPTちゃん (GPT4)に聞いてみた。

Stataの「margins」コマンドは、統計モデルの予測値や効果を詳細に解析するために用いられます。このコマンドは、特に回帰分析において非常に有用です。具体的には、モデル内の独立変数が従属変数に与える平均的な影響(平均限界効果)を計算し、それを報告するのに使用されます。

たとえば、ある線形回帰モデルがあるとして、そのモデル内の各独立変数が従属変数に与える影響を理解するために「margins」コマンドを使用できます。このコマンドは、モデルにおける特定の変数の値の変化が、従属変数の予測値にどのように影響するかを示します。これにより、モデルが予測する効果の実用的な意味を解釈しやすくなります。

また、異なるサブグループ間での効果の比較や、モデルの予測がどのように変化するかを視覚化するためにも使用されます。これは、政策分析や公衆衛生の研究において特に重要です。例えば、特定の健康介入が異なる年齢層の子供たちにどのような影響を与えるかを分析する際に「margins」コマンドを利用することが考えられます。

https://chat.openai.com/

わかりにくいのは、日本人にとって”margin”という単語が馴染みがないからだと思われる。いつも「周辺」なのか「周辺部」なのかあるいは「限界」なのかが感覚的にわかりにくい。

Quick Start

例が豊富にあったので、こちらも掲載。

推定限界平均値(最小二乗平均値)

ANOVA後の\(a\)の各水準における\(y\)の推定限界平均 \(y\ a\#\#b\)

margins a, asbalanced

ANOVA後の\(a\)と\(b\)の交互作用の各水準における\(y\)の推定限界平均 \(y \ a\#\#b\#\#c\)

margins a#b, asbalanced

manova後の\(a\)の各水準における\(y_1、y_2、y_3\)の推定限界平均 \(y_1\ y_2\ y_3 = a\#\#b\)

margins a, asbalanced

調整済み平均値と調整済み予測値

\(y\)を\(i.a, x\)で回帰した後、\(x\)が平均値であるときの\(a\)の各水準に対する\(y\)の調整平均値

margins a, atmeans

上記と同じだが、\(x\)を平均値ではなく\(10\)に設定する。

margins a, at(x=10)

上と同じで、\(x=20, x=30, x=40\)の修正平均値も報告する。

margins a, at(x=(10(10)40))

\(x\)がその平均値にあるとき、\(a\)の各水準に対する\(y = 1\)の調整済み予測確率。

logit y a##c.x
        margins a, atmeans

\(x\)を\(25\)とし、\(a\)と\(b\)の交互作用の各水準における調整済み予測確率。

logit y a##b##c.x
        margins a#b, at(x=25)

上記の解析で、\(x = 25, b = 1\)のときの\(a\)の各レベルに対する調整済み予測値

margins a, at(x=25 b=1)

予測マージンと潜在的結果手段

ロジスティック回帰分析 \(y \ a\#\#b\ x_1\ x_2\) の後に \(y = 1\) となる平均予測確率。

margins

\(a\)の各レベルの予測マージン(潜在的な結果の平均値)。

margins a

\(x_1\)を\(10, 20, 30, 40\)に設定した場合の\(a\)の予測マージン

margins a, at(x1=(10(10)40))

\(a\)と\(b\)の相互作用のレベルの予測マージン

margins a#b

\(x_1 = 10, 20, 30\)および\(x_2 = 50, 100, 150\)のすべての組み合わせに対する\(a\)の予測マージン。

margins a, at(x1=(10(10)30) x2=(50(50)150))

まず\(x_1 = 10, 20, 30\)で\(x_2\)が観測値の場合、次に\(x_2 = 50, 100, 150\)で\(x_1\)が観測値の場合の\(a\)の予測マージン。

     margins a, at(x1=(10(10)30))  at(x2=(50(50)150))

\(svy:\text{logit}\ y \ a\#\#b\ x_1\ x_2\) の後の\(a\)の予測マージン

margins a, vce(unconditional)

mlogit\(y \ x_1\ x_2\ i.a\)後の\(y = 1, y = 2, \cdots\) の平均予測確率

margins

\(y\)の各結果に対する\(a\)の各レベルの予測マージン

margins a

平均限界効果と平均部分効果

連続の\(x_1\)と\(x_2\)、バイナリの\(a\)を用いたプロビット\(y\ c.x_1\#\#c.x_2\#\#a\) の後、\(y = 1\)の予測確率に対する\(x_1\)の平均限界効果。

margins, dydx(x1)

バイナリ\(a\)の平均限界効果(平均部分効果)

margins, dydx(a)

\(x_2\)を\(10, 20, 30, 40\)に設定した場合の\(x_1\)の平均限界効果

margins, dydx(x1) at(x2=(10(10)40))

\(a\)を\(0\)に設定し、次に\(1\)に設定した場合の\(x_1\)の平均限界効果

margins a, dydx(x1)

モデル内の各変数の平均限界効果

 margins, dydx(*)

\(y\ x_1 \ x_2\ x_3, ll(0)\)トビット後の\(y\)の期待値\(e(0,.)\)に対する全変数の平均限界効果。

margins, dydx(*) predict(e(0,.))

上記と同じで、\(y\)の打ち切り期待値\(ystar(0,.)\)と線形予測値\(xb\)の限界効果を報告する。

margins, dydx(*) predict(e(0,.)) predict(ystar(0,.)) predict(xb)

条件付き限界効果と条件付き部分効果

\(y=1\)の予測確率に対する\(x_1\)の限界効果(すべての変数を平均値に設定、連続\(x_1,x_2\)とバイナリ\(a\)のプロビット\(y\ c.x_1\#\#c.x_2\#\#a\) の場合

margins, dydx(x1) atmeans

すべての変数を平均値に設定した場合の\(a\)の限界効果(部分効果)

margins, dydx(a) atmeans

\(a = 0\)で\(x_1\)と\(x_2\)を平均値に設定した場合の\(x_1\)の限界効果

margins, dydx(x1) at(a=0 (mean) x1 x2)

同上

margins, dydx(x1) at(a=0) atmeans

\(a=0, 1, x_1=50, 100, x2=10, 20, 30, 40\)のすべての可能な組み合わせに対する\(x_1\)の限界効果

 margins a, dydx(x1) at(x1=(50 100) x2=(10(10)40))

すべての変数を平均値に設定した場合の\(x_1, x_2, a\)の限界効果

margins, dydx(*) atmeans

文法

基本的な文法は

margins [marginlist] [if] [in][weight] [, response_options options] 

となる。marginlist は現在の推定結果に現れる因子変数または交互作用のリストである。変数はi.接頭辞付きでも接頭辞なしでも入力でき、任意の因子変数構文を使用できる。以下は例。

margins i.sex i.group i.sex#i.group
margins sex group sex#i.group
margins sex##group

response_optionsとその説明は以下。

response_options説明
pr(edict)“predict”のmarginsを推定。
exp(ression)“pnl_exp”のmarginsを推定。
dydxvarlistの変数のmarginsを推定。
eyexvarlist の変数の弾力性を推定。
dyex\(d(\hat{y})/d(\ln{x})\)の半弾力性を推定。
eydx\(d(\ln{\hat{y}})/d(x)\)の半弾力性を推定。
cont(inous)factorレベルの指標を連続的なものとして扱う。
括弧の内部は省略可。

以下はoptionsとその説明。

options説明
Maingrandmarginlistがない場合のデフォルト。
Atat共変量の指定値におけるmarginsの推定。
atmenas共変量の平均値でmarginsを推定。
asbal(anced)すべての要因変数をバランスとして扱う。
if/in/overover(varlist)varlistのユニークな値でmarginsを推定。
subpop(subspec)部分母集団のmarginsを推定。
Withinwithin(varlist)varlistの入れ子要素のユニークな値でmarginsを推定。。
Contrastcontrast_optionsmarginsのcontrastで指定されているすべてのoptionが利用可能。
Pairwise comparisonsowcompare_optionsmarginsのpwcompareで指定されているすべてのoptionが利用可能。
SEvce(delta)デルタ法でSEを推定。
vce(unconditional)共変量のサンプリングを考慮してSEを推定。
noseSEを推定しない。
Advancednoweights推定で指定された重みを無視する。
noe(sample)marginsを推定サンプルに限定しない。
emptycells(empspec)空セルのバランス因子処理。
estimatol(erance)(tol)推定可能な関数を決定する際に使用する許容誤差を指定。
デフォルトは estimtolerance(1e-5) 。
noestimcheck推定可能性チェックを抑制。
force潜在的問題にもかかわらずmarginsを推定。
chain(rule)導関数を計算するときに連鎖法則を使う。
nochain(rule)連鎖法則を使用しない。
Reportingl(evel)(#)信頼水準を設定する。デフォルトは level(95)
mcomp(are)(method)多重比較の調整。デフォルトはmcompare(noadjust)
noatlegend固定共変量値の凡例を抑制する。
post推定結果としてのpost marginsとそのVCE
その他df(#)p値と信頼区間を計算するために、自由度を#とするt分布を使用する。
noadj(ust)多重比較を調整しない。
bon(ferroni)ボンフェローニ法(すべての項で調整する)。
sid(ak)Sidak法(すべての項で調整する)。
sch(effe)Scheffe法。
括弧の内部は省略可。

optionの説明

*注意。オプションの説明は簡潔で、専門用語を使用している。初めてマージンについて読む場合は、備考と例まで読み飛ばすこと。

predict(pred opt) と expression(pnl exp) は互いに排他的であり、これらは応答を指定する。どちらも指定されていない場合、応答は基礎となる推定コマンドの後にpredictによって生成されるデフォルトの予測値となる。mlogitのようないくつかの推定コマンドは、predictとは異なるマージンのデフォルト予測を記録する。

predict(pred opt) は、レスポンスとして使用される変数を生成するために predict コマンドで指定されるオプションを指定する。ロジスティック推定後、predictコマンドのデフォルトである確率ではなく、線形予測値を得るためにpredict(xb)を指定することができる。

複数の予測値のmarginsを同時に計算するために、複数の predict() オプションを指定できます。

expression(pnl exp)は応答を式として指定する。pnl expの完全な説明はpredictnlのマニュアルを参照。ロジスティック推定後、応答として確率ではなく相対オッズを使用するために expression(exp(predict(xb)) を指定することができる。例については,例12: 指定された式のmarginsを参照のこと。

dydx(varlist)、eyex(varlist)、dyex(varlist)、およびeydx(varlist)は、マージンが応答そのものではなく、varlistに関する応答の導関数を報告するように要求する。eyex()、dyex()、およびeydx()は、導関数を弾性率として報告する。

continuous は、dydx() または eydx() のいずれかが指定されている場合にのみ関係する。これは、因子変数の水準を連続として扱うことを指定する。 Derivatives versus discrete differences を参照すること。

grandは、全体のマージンを報告することを指定する。marginlistが空の場合、grandがデフォルトオプションとして仮定される。

以下は例となる。

At

at(atspec)は固定として扱う共変量の値を指定する。

at(age = 20)

at(age=20) は、共変量 age を指定された値に固定する。at() は、連続または因子の共変量を固定するために使用できる。

at(age=20 sex=1)

at(age=20 sex=1)は、共変量ageとsexを同時に指定された値に固定する。

at(age=(20 30 40 50))
at(age=20(10)50)

at(age=(20 30 40 50)) は、まず年齢を20歳に固定し、次に30歳、 ・・・とmarginsは、指定された値ごとに別々の結果を生成する。下のコードも同様。

at((mean) age (median) distance) 

at((mean) age (median) distance) は、共変量を指定された要約統計量に固定する。 at((p25) all) は、すべての共変量をそれらの25パーセンタイル値に固定する。要約統計量修飾子の完全なリストは at() の構文を参照。

at((mean) all (median) x x2=1.2 z=(1 2 3))

at((mean) all (median) x x2=1.2 z=(1 2 3))は、一般的なものから具体的なものへと処理され、指定された共変量の設定は、allで指定された一般的な設定よりも優先される。したがって、x(中央値で固定)、x2(1.2で固定)、z(最初に1、次に2、最後に3で固定)以外のすべての共変量は平均値で固定される。

at((means) all (asobserved) x2)

at((means) all (asobserved) x2)は、x2を除くすべての共変量を平均に設定する便利な方法である。

at()オプションは複数指定することができ、それぞれ異なるmarginsが得られる。

atmeansは、共変量が平均値で固定されることを指定し、at((mean) all)の略記法である。例えば、

. margins . . . , atmeans at((p25) x) at((p75) x)

は、xを除くすべての共変量の平均で評価されるmarginsの2つのセットを生成する。

asbalancedは、at((asbalanced) factor)の省略記法で、各水準に同数のオブザベーションがあるかのように因子共変量が評価されることを指定する。asbalancedは、at((asbalanced) factor)と異なり、asbalancedはatmeansと同じように後続のat()オプションに影響する。

if/in/over

over(varlist)は、varlistで定義されたグループに対して別々のmarginsを推定することを指定する。varlist の変数は、非負の整数値(または欠損値)でなければならない。変数はモデルの共変量である必要はない。over() と vce(unconditional) オプションを組み合わせると、各グループは部分集団として扱われる。

subpop( varname if ) は、vce(unconditional) オプションとの併用を意図している。これは、指標変数または if 式によって識別される1つの部分母集団、またはその両方についてmarginsを推定することを指定する。ゼロまたは欠損は、その観察値を除外することを示し、非ゼロまたは非欠損は、その観察値を含めることを示す。vce(unconditional)も使用する場合に,if 式や範囲よりも subpop() が好まれる理由については,[SVY] Subpopulation estimationを参照のこと.subpop() が vce(unconditional) なしで使用される場合、それは単に追加の if 修飾子として扱われる。

SE

vce(delta) と vce(unconditional) は、VCE とそれに対応する標準誤差の計算方法を指定する。

vce(delta)がデフォルト。delta 法は、応答の式と推定コマンドの VCE に適用される。この方法は、応答を計算するために使用される共変量の値が与えられているか、またはすべての共変量がat()を使用して固定されていない場合は、データが与えられていることを前提としている。

vce(unconditional) は、固定されていない共変量がサンプリングされたことを考慮した方法で扱われることを指定する。VCEは線形化法を用いて推定される。この方法は、分布の仮定に対する異種分散やその他の違反を許容し、推定コマンドで指定された vce(robust) や vce(cluster … ) と同じ方法でオブザベーション間の相関を許容する。この方法は、データがsvysetの場合、複雑な調査デザインも考慮する。調査データと代表標本によるmarginsの取得を参照。複雑な調査データを使用する場合、この方法ではモデルに線形化分散推定法を使用する必要がある。再現に基づく手法でのマージンの例については、[SVY] svy postestimationを参照。

noseはVCEと標準誤差の計算を抑制する。このオプションの使用例は、モデル仕様の要件を参照。

Advanced

noweightsは、直前の推定コマンドで指定された重みをmarginsで無視するように指定する。デフォルトでは、marginsは推定の際に指定された重みを使用して回答を平均し、要約統計量を計算する。marginsコマンドで重みが指定されている場合、以前に指定された重みが上書きされるため、noweightsを指定する必要はない。svy:estimationの後にvce(unconditional)オプションを指定した場合、noweightsオプションは使用できない。meglmのようなマルチレベル・モデルの場合、デフォルトの動作は、与えられたオブザベーション内の対応するマルチレベルの重みを掛け合わせることによって、各オブザベーションに対して1つの重み値を構築することである。

noesampleは、marginsの計算を直前の推定コマンドで使用された推定サンプルに制限しないことを指定する。例15: Margins evaluated out of sampleを参照。

デフォルトのデルタ法VCEでは、推定標本以外の標本でノーサンプル・マージンを推定することができる。このような結果は、使用するデータが与えられたものとして扱われるという仮定の下で有効である。

noesampleとvce(unconditional)を一緒に指定することもできるが、その場合、メモリ上のデータが元のe(sample)に対応していることを確認する必要がある。そのことを示すために、forceオプションも指定しなければならない。vce(unconditional)の計算を推定サンプルとは異なるサンプルで行うことは、あるデータセットで係数を推定し、別のデータセットで線形化で使用するスコアを計算することと同じであることに注意する。 [P] robustを参照。

emptycells() は、 balanced として扱われる因子変数を含む交互作用において、空のセルをどのように扱うかを指定する。

emptycells(reweight)は、欠落しているセルを修正するために、観測されたセルの効果を増加させることを指定する。emptycells(reweight) は within() オプションが指定されたときに暗黙的に使われる。

estimtolerance(tol)は推定可能な関数を決定するために使用される数値許容誤差を指定する。デフォルトは estimtolerance(1e-5) 。モデル係数の線形結合\(z\)は、以下の場合、推定不可能であると判断される。$$\text{mreldif}(z, times \text{H}) > tol$$ここで H は Methods and formulas で定義されている。

noestimcheckはマージンの推定可能性をチェックしないことを指定する。デフォルトでは、要求されたマージンがチェックされ、推定不可能と判断されたマージンはそのようにレポートされる。推定不能は通常空のセルが原因である。noestimcheckが指定された場合、結果の推定値が操作可能であるにもかかわらず、通常の方法で推定値が計算され、レポートされる。マージンの推定可能性を参照。

forceは、明らかな前提条件違反のためにエラーメッセージを出すような状況でも、marginに処理を進めるように指示する。安易にフォースを指定してはいけない。統計的な問題を理解し、十分に評価する必要がある。forceの使用例については、estimates useコマンドの後にmarginを使用するを参照のこと。

chainruleおよびnochainruleは、marginsが微分を数値計算する際に連鎖規則を使用するかどうかを指定する。公式のStata estimatorの後にmarginsを使用する場合、これらのオプションを指定する必要はない。コミュニティが作成したコマンドで推定を行った場合は、nochainruleを指定する。nochainruleは、パラメータと共変量がどのように結合して応答を形成するかを仮定しないため、より安全である。nochainruleは、expression()オプションが指定されたときに暗黙的に使用される。

はじめに

marginsはポスト推定コマンドで、regressやlogisticなどの推定コマンドを使用してモデルをフィットした後、または他のほとんどの推定コマンドを使用した後に使用するコマンドである。marginsは、responseのmarginsおよびresponseの微分のmargins(限界効果とも呼ばれる)を推定し、レポートする。marginsは、共変量の一部またはすべてが固定された適合モデルに基づく統計量である。限界効果は、共変量の変化に対する反応の変化であり、微分、弾力性、半弾力性として報告されることがある。マージンの概要については、Williams (2012)を参照。

responseのmarginsを得る

response marginsと呼ばれるものは、予測margins、調整済み予測、リサイクル予測とも呼ばれる。バランスのとれたデータに適用される場合、回答のマージンは、推定限界平均や最小2乗平均とも呼ばれる。marginsは、共変量の一部またはすべてが実際とは異なる値に固定されたデータ集合で計算された適合モデルに基づく統計量である。したがって、実際に男性を表す観察値は,女性を表す観察値と同様に含まれる。女性のmarginal平均は、すべての観察値を女性を表すかのように取り扱うことによって、同様に得られる。

計算の際、性別はモデルのどこに出てきても男性または女性として扱われる。モデルは以下のようになる。

regress y age bp i.sex sex#c.age sex#c.bp

男性と女性の平均値のmargins計算を行う際に、marginsはi.sexの直接効果だけでなくsex#c.ageとsex#c.bpの間接効果も考慮する。marginsされる応答は,[R]predictによって生成される任意の統計量,またはそれらの任意の表現であり得る。

標準誤差は、少なくともデフォルトではデルタ法によって得られる。デルタ法はmarginal responseを得るために共変量が評価される値が固定されていると仮定する。標本が母集団を表している場合、svyを使用しているかどうかにかかわらず([SVY] svyを参照)、marginsのvce(unconditional) オプションを指定することができ、marginsは共変量のサンプリング変動を考慮した標準誤差を生成する。研究者の中には、これを説明するために予測マージンという用語を留保している者もいる。marginsを理解する最善の方法は、いくつかの例を見ることである。以下の例を自分で実行することができる。

データを用いた具体例

まずはいつものようにデータセットの準備から。

use https://www.stata-press.com/data/r18/margex, clear

例1:回帰後の単純なケース

reg y i.sex i.group
margins sex

報告されている数値は、\(y\)の線形予測の平均値である。性別とグループに対する\(y\)の線形回帰に基づくと、データ内の全員が男性であるかのように扱われた場合、\(60.6\)が\(y\)の線形予測の平均値になり、全員が女性であるかのように扱われた場合、\(78.9\)が平均値になる。

例2:ロジスティック後の単純なケース

logit outcome i.sex i.group
margins sex

報告されている数字は、平均予測確率である。性および群に関する結果のロジスティック回帰に基づくと、0.13は、データ中の全員が男性であるかのように扱われた場合の結果の平均確率であり、0.19は、全員が女性であるかのように扱われた場合の平均確率である。

marginsはregressの後の平均値とlogisticの後の平均確率を報告する。デフォルトでは、marginsはpredict([R]predict参照)が予測するものであれば何でも表を作成する。あるいは、marginsのpredict()オプションを使用すると、predictが生成できるものなら何でもmarginsは表を作ることができる。

例3:Average response vs response at average

例2では、marginsはsex = 0とsex = 1の結果の平均確率を報告した。代わりに共変量の平均で評価された予測確率が欲しい場合は、marginsのatmeansオプションを指定する。以下のように

logit outcome i.sex i.group
margins sex, atmeans

とする。共変量の平均における予測は、予測の平均とは異なる。1つ目は、平均的な特徴を持つ人の期待確率であり、別の問題では、3/4結婚して1.2人の子供がいるかもしれない人である。もう1つは、データ中の実際の人物における確率の平均である。

atmeansまたは他のatオプションを指定すると、marginsは表の上の凡例に共変量に使用された値を表示する。marginsは、使用しない値を含むすべての共変量の値を、その後に続く結果に表示する。この例では、marginsは性別の平均値を報告しているが、これらの平均値は使用されていない。なぜなら、我々はsexのマージンを求めたので、sexはまず0に固定され、次に1に固定されたからである。

この凡例を表示したくない場合は、nolegendオプションを指定する。

例4:一つのコマンドで複数のマージン

1つのmarginコマンドで複数のmarginsを報告することができる。次のように入力する。

margins sex group

これは以下のように入力するのと同じである。

margins sex
margins group

同じコマンドで複数のmarginsが要求された場合、それぞれ別々に見積もられる。しかし、marginsのpostオプションも指定した場合には違いがある。そうすると、要求されたすべてのmarginsの分散共分散行列がポストされ、それによって、たとえばmarginsの等質性を検定することができる。marginsの等質性の検定については、例10:marginsの検定-marginsの対比で説明する。

いずれにせよ、以下では男女別とグループ別のマージンを要求する。

margins sex group

例5:交互作用項を含むmargins

marginsの計算の基礎となる推定コマンドには、性別とグループの交互作用のような交互作用項が含まれていることがある。

logit outcome i.sex i.group sex#group
* logit outcome i.sex##i.groupと同じ

margins sex group

i.sex i.group sex#groupとタイプしてモデルを当てはめたが、i.sex##i.groupとタイプしても意味は同じである。

例4で述べたように、性別の結果とグループの結果は独立して計算される。

男性 ( 性 = 0 ) のマージンは 0.16 である。この確率0.16は、主効果のsex = 0とsexと群の交互作用のsex = 0を含めて、データ中のすべての人がsex = 0のように扱われた場合の平均確率である。

もしmargins sex、atmeansを指定していたら、平均確率ではなく、平均で評価された確率が得られただろう。この0.10は、適合モデルを取り、すべての場所でsex = 0を差し込み、それらが使用されているすべての場所でグループ指標変数の平均値を差し込むことによって計算される。つまり、観察によってグループ指標を(1, 0, 0)、(0, 1, 0)、または(0, 0, 1)として扱うのではなく、グループ指標を(0.40, 0.37, 0.23)として扱い、これはグループ=1、グループ=2、グループ=3の平均値である。

例6:連続変数のmargins

上記の例に、連続共変量年齢をモデルに加え、margins sex groupを再実行する。

logit outcome i.sex##i.group age
margins sex group

例5で示した結果と比較すると、性別の結果はほとんど変化していないが、グループ1と3の結果は著しく変化している。この表が異なるのは、性別とグループだけでなく、連続共変量である年齢でも調整しているからである。

我々は、例 8で交互作用の検証を続ける。連続変数を追加したので、連続変数のマージンを得る方法とその解釈を説明するために回り道をしよう。

例7:連続変数のmargins

同じ例を続ける。今度は共変量ageについて見てみる。

logit outcome i.sex##i.group age
margins age

上記のコードはエラーとなる。” age not found in list of covariates “というメッセージは、marginsの言い方で、”そう、年齢はモデルに含まれるかもしれないが、含まれるとしても因子変数としてではなく、連続変数として含まれる “ということである。marginsは、年齢が連続変数であるため、マージンを評価できる値が無限にあると言うかもしれない。marginsは、連続共変量についてより多くのガイダンスを必要とする。at()オプションを使い、次のようにタイプすることで、そのガイダンスを提供することができる。

margins, at(age = 40)

なぜそのような結果になるのかを理解するために、次のように入力してみよう。

margins

このmarginsは、全体的なmagins(何も一定にしないmargins)を報告する。我々のモデルはロジスティックなので、予測確率の平均値が報告される。at()オプションは、1つまたは複数の共変量を指定された値に固定し、因子変数と連続変数の両方で使用できる。したがって、margins, at(age=40)と入力すると、margins は、age=40と設定された全員の回答をデータ上で平均する。報告されているのは、モデルの他の共変量で調整された、年齢=40のマージンである。もし30歳、35歳、40歳、45歳、50歳のマージンを得たい場合は、次のように入力する。

margins, at(age=(30 35 40 45 50))
margins, at(age = 30(5)50)

例8:相互作用項のmargins

以下のように入力することで、sexとgroupのレベルのすべての可能な組み合わせのmarginsを得ることができる。

margins sex#group

表の最初の行は、sex = 0(男性)、group = 1の場合のmarginal確率である。つまり、データ中の全員がsex = 0、group = 1であるかのように扱われた場合の推定確率を報告している。また、その他の性別とグループの組み合わせもすべて報告されている。ちなみに、フィットしたモデルにsex#groupが含まれていなくても、margin sex#groupと入力することは可能であった。しかし、marginsは、i.sexとi.groupがモデルのどこかに現れることを要求している。モデルの外側に値を固定すると、grand marginsを生み出すだけだからである。

例9:marginsの分解

例6では

logit outcome i.sex##i.group age

を考えた。例6では、margins sexを入力し、男性で0.160、女性で0.197を得た。そこでこれを分解してみよう。

  1. 男性のマージンである0.160は、全員が男性であるかのように扱う。
    1a. 男性を男性として扱い、
    1b. 女性を男性として扱う。
  2. 女性のマージンである0.197は、全員が女性であるかのように扱っている。
    2a. 男性を女性として扱い、
    2b. 女性を女性として扱う。

つまり、margins 1aと1bは1の分解、margins 2aと2bは2の分解である。1aと2aは以下のように入力することで得ることができる。

margins if sex == 0, at(sex = (0 1))

というのも、if sex==0という修飾子をつけると、マージンが男性のみに限定されてしまうからである。同様に、1bと2bは次のように入力すれば得られる。

margins if sex == 1, at(sex = (0 1))

例6の結果と上記の結果をまとめると、次のようになる。

全体を個人として扱うmargins0.170
全体を男性として扱うmargins0.160
男性を男性として扱うmargins0.079
男性を女性として扱うmargins0.240
全体を女性として扱うmargins0.197
男性を女性として扱うmargins0.134
女性を女性として扱うmargins0.260

例10:marginsのテスト-marginsの対比

先ほどの例の続きで、2bと1bが等しいかどうかをテストする。つまり、女性として扱われた女性の肯定的な結果の平均確率が、男性として扱われた女性のそれと等しいかどうかをテストするのは興味深いだろう。この検定は、我々のモデルにおける性の全体的な有意性の検定とは異なる。我々のモデルで行われる検定は、他の共変量の値が等しいときに、陽性結果の確率が男性と女性で異なるかどうかの検定であろう。余白の等質性の検定は、我々のデータにおける両性が持つ他の共変量の値の異なるパターンが与えられたときに、平均確率が異なるかどうかの検定である。

また、marginsからの結果を推定結果として扱うことで、このようなテストを行うこともできる。marginsに関するテストを行うには3つのステップが必要である。まず、対象となるすべてのmarginsが1つのmarginsコマンドだけで報告されるようにアレンジしなければならない。第2に、marginsのpostオプションを指定しなければならない。第3に、testコマンドで検定を実行する。

このような検定や比較は、マージンを対比することで容易に実行できる。 [R] margins, contrastを参照。R]marginsplotのmargins-effects(離散的な周辺効果)の対比も参照。

先の例では、結果を得るために2つのコマンドを使った、

margins if sex==0, at(sex=(0 1))
margins if sex==1, at(sex=(0 1))

しかし、1つのコマンドを入力するだけで、同じ結果を得ることができる。

margins, over(sex) at(sex=(0 1))

マージンを実行すると、over(sex)はまずサンプルをsex==0に制限し、次にsex==1に制限する。これは、前に指定した2つの異なるif条件と同じである。女性として扱われる女性と男性として扱われる女性が等しいかどうかをテストするには、次のようにする必要がある。

margins, over(sex) at(sex=(0 1)) post
test _b[2._at#1.sex] = _b[1._at#1.sex]

2つ目のコマンドは突然出てきたように見えるかもしれない。marginsコマンドにpostを指定すると、marginsはあたかも推定コマンドであるかのように振る舞う。つまり、1) 推定値と完全なVCEをe()にpostし、2) 他の推定コマンドと同様に結果を再生する能力を獲得し、3) 標準的な推定後コマンドにアクセスできるようになる。項目3では、なぜtestが使えるのかを説明する。b[2.at#1.sex]とb[1.at#1.sex]をテストしたい。つまり、我々が入力したのは

margins, over(sex) at(sex=(0 1)) post
margins, coeflegend
test _b[2._at#1.sex] = _b[1._at#1.sex]

margins, coeflegendは自身で試してみる。他の2つのコマンドを実行した結果は以下の通りである。

margins, over(sex) at(sex = (0 1)) post
test _b[2._at#1.sex] = _b[1._at#1.sex]

marginsのcontrastを使えば、同じテストを1つのコマンドで実行できる。

logistic outcome i.sex i.group sex#group age
margins, over(sex) at(sex=(0 1)) contrast(atcontrast(r._at) wald)

ロジスティック・モデルを再フィットしたのは、その推定結果がmarginsを計上したときに置き換えられたからである。我々が望む対比を実行する構文は、確かに明らかではない。at()グループ間でのcontrast(検定)は、マージンそのものやover()グループ間でのcontrastよりも難しい。また、デフォルトでは提供されていないWald検定を明示的に要求した。それにもかかわらず、女性の(2 vs 1)の\({\chi}^2\)統計量とそのp値は、我々の検定コマンドの結果と一致する。また、男性として扱われた男性の反応が、女性として扱われた男性の反応と等しいかどうかの検定も得られる。marginsのcontrastに関しては[R] marings, contrastも参照。

例11:指定された予測のmargins

ここからは違うデータセットを用いる。

use https://www.stata-press.com/data/r18/margex, clear
tobit ycn i.sex i.group sex#group age, ul(90)

その変数について次のような話をする。 私たちは桃園を経営しており、そこでは人々に桃の収穫を許可している。果樹園に入る権利と20ドルで、空のカゴを1つもらう。1人が摘める桃の数に公式な制限はないが、1つのカゴに入る桃は90個だけである。上のtobitモデルの従属変数ycnは、摘み取られた桃の数である。ycn が90で打ち切られているので、打ち切り正規回帰の特殊なケースである tobit を使用している。このモデルをフィッティングした後、

margins sex

を実行すると、男性あるいは女性について、摘果された桃の数のmarginsが得られる。これは、tobitの後のpredictがデフォルトで非検出数を生成するからである。打ち切り予測値を得るには、予測値のystar(.,90)オプションを指定しなければならない。その応答に基づいてマージンを得たい場合は、次のように入力する。

margins sex, predict(ystar(.,90))

これまでの例では、sex = 1は女性であったから、果樹園を訪れる女性は男性よりもバスケットに桃を入れるのが上手であることがわかる。

例12:指定した式のmargins

桃の果樹園の例と、前回フィットしたモデルを続ける。

use https://www.stata-press.com/data/r18/margex
tobit ycn i.sex i.group sex#group age, ul(90)

カゴがどの程度役に立っているか調べてみよう。実際に摘まれた桃の数の、カゴがもっと大きかったら摘まれたであろう数に対する比率はどうなるだろうか。 例11で述べたように、predict, ystar(.,90)は、カゴの大きさに制限がある場合に摘み取られるであろう数を予測する。我々は、これら2つの予測の比率を求めたい。この比率は、バスケットがどの程度うまく機能するかを割合として測定する。以下のように入力する。

margins sex, expression(predict(ystar(.,90))/predict(xb))

そうすると、男性として扱われた人と女性として扱われた人の割合がわかるが、私たちが知りたいのは、真の男性と真の女性に対してバスケットがどの程度機能するかということである。

margins, over(sex) expression(predict(ystar(0,90))/predict(xb))

ちなみに、データ収集期間中、限られたカゴのサイズによって節約された桃の数を数えるには、次のように入力した。

count
margins, expression(3000*(predict(xb)-predict(ystar(.,90))))

救われた桃の数は9,183個となった。

関連記事

ちょっと長くなるので、一度ここで。

数値変数の要約統計量を作成するコマンド
marginsplotの調整方法

コメント

タイトルとURLをコピーしました