日誌

ロジスティック回帰のメモ

※2013/10/26 語句修正; 2013/11/07 グループごとの回帰追加; 2013/12/23 目次追加,(1)に
factor variablesの確認法,(2)にcontrastコマンド追記
;

記事の目次

(1)カテゴリ変数のreferenceも結果に出力する方法
(2)1つのカテゴリ変数全体の検定を行ってカイ二乗値とp値を出す
(3)グループごとの回帰(層別)


必要だけどつい忘れがちになるポイントのメモです。バージョンはStata 13.0,
使用データセットは,マニュアルのlogisticでexapmle
として使っているHosmer & Lemeshow dataです。インターネットにつながった状態で,

webuse lbw

と打つと読み込まれます。

アウトカムは低体重出生かどうかの2値データ
 low
1:birthweight<2500g
0:birthweight>=2500g

説明変数は人種で3区分のカテゴリデータ
 race
1:white
2:black
3:other

として単純にロジスティック回帰分析を実行すると

logistic low i.race

となり,以下のように
                       
low      Odds Ratio    Std. Err.       z       P>z    [95% Conf.    Interval]
race   
  black    2.327536    1.078613    1.82    0.068    .9385072    5.772385
  other    1.889234    .6571342    1.83    0.067    .9554577    3.735597
   
_cons    .3150685    .0753382    -4.83    0.000    .1971825    .503433
                       
といった結果が出てきます。
i.というのを説明変数の頭につけることで,その変数(ここではrace)を
カテゴリ変数(factor variables)として扱ってくれます。
自動的に複数の2区分変数(ダミー変数)を作成して投入してるイメージです。
デフォルトでは最も低い値がリファレンスになります。

(追記:2013/12/23)
factor variablesがどのように作られているか確認

 list race i.race in 1/5

     +-----------------------------------+
     |           1b.     2.      3.     |
     |  race   race   race   race |
     |-------------------------------------|
  1. | black      0      1      0    |
  2. | other      0      0      1     |
  3. | white      0      0      0     |
  4. | white      0      0      0     |
  5. | white      0      0      0     |
     +-----------------------------------+

変数として作成されてはいませんが,このように内部的に
2区分変数(ダミー変数)が作られていることが分かります。


(1)カテゴリ変数のreferenceも結果に出力する方法

デフォルトではオッズ比を出す際にリファレンスとなるカテゴリは出力
されないのですが,オプションにallbaselevelsをつけると,

logistic low i.race, allbaselevels
                       
low      Odds Ratio     Std. Err.        z      P>z    [95% Conf.    Interval]
race   
   white    1                (base)
   black    2.327536    1.078613    1.82    0.068    .9385072    5.772385
   other    1.889234    .6571342    1.83    0.067    .9554577    3.735597
   
_cons    .3150685    .0753382    -4.83    0.000    .1971825    .503433


となり,隠れていたwhiteがでてきました。当然のごとく,
オッズ比は1となっています。

また,ラベルをとってどの値と対応しているか確認する場合はnofvlabelを追加します

logistic low i.race, allbaselevels nofvlabel
                       
low    Odds Ratio    Std. Err.     z        P>z    [95% Conf.    Interval]
race   
   1     1                (base)
   2     2.327536    1.078613    1.82    0.068    .9385072    5.772385
   3     1.889234    .6571342    1.83    0.067    .9554577    3.735597
   
_cons  .3150685    .0753382    -4.83    0.000    .1971825    .503433

                       
つまり,値1に対する値2,3のオッズ比が算出されているということがわかります。
リファレンスを変えたい場合は,i.raceの項を

ib2.race
ib(last).race

にするとそれぞれ変わります。デフォルトはib(first).raceという意味になっています。
詳しくは

help factor variables


(2)1つのカテゴリ変数全体の検定を行ってカイ二乗値とp値を出す

それぞれの2区分変数(ダミー変数)の統計量zが出てきますが,論文には
カテゴリ変数全体としてのカイ二乗値を書いてあるのをよく見かけます。
これを出すには,logisticコマンドを実行した後に,さらにtestコマンドを使って,
下記のように結果でパラメータが示されている2区分変数の値を変数の頭につけて,

logistic low i.race
test 2.race 3.race

とします。そうすると,下のような結果が出てきます。

(    1)    [low]2.race =    0
(    2)    [low]3.race =    0

        chi2(  2)    =    4.92
        Prob > chi2    =    0.0853

つまり,カテゴリ変数raceの全体のワルド検定の結果は
χ2=4.92, df=2, p=0.0853
という情報が分かります。

(追記:2013/12/23)
testコマンドよりもっと簡単に全体の検定結果を表示できる
ものがありました。

logistic low i.race
contrast race

Contrasts of marginal linear predictions

Margins      : asbalanced

------------------------------------------------
               |          df        chi2     P>chi2
-------------+----------------------------------
        race |          2        4.92     0.0853
------------------------------------------------



(3)グループごとの回帰(層別)

男女別など,グループ別にロジスティック回帰を行いたい時の方法です。

同じデータを例に,今度は喫煙が低体重出生におよぼす影響を
人種別に解析してみます。まず基本の解析は以下の通りです。

logistic low i.smoke


low        Odds Ratio    Std. Err.         z       P>z    [95% Conf.    Interval]
                       
smoke  
smoker   2.021944      .6462989     2.20    0.028    1.08066     3.783112
_cons       .3372093    .0724103    -5.06    0.000     .2213694    .5136667

                     
人種別に同じ解析をするには,logisticコマンドの前に以下のような
コマンドを付け加えます。raceの部分を他のカテゴリ変数に変えれば
その変数のカテゴリごとに結果が出ます

by race, sort : logistic low i.smoke


-> race = white
               
low       Odds Ratio    Std. Err.         z     P>z     [95% Conf.    Interval]
               
smoke
smoker   5.757576    3.444621     2.93    0.003     1.782321    18.59916
_cons       .1             .0524404    -4.39    0.000     .0357788    .2794949


-> race = black
             
low  Odds Ratio         Std. Err.        z    P>z     [95% Conf.    Interval]
               
smoke
smoker           3.3    2.775878    1.42    0.156     .6346062    17.16025
_cons    .4545455    .2451636    -1.46    0.144     .1579332    1.308222

             
-> race = other
           
low       Odds Ratio    Std. Err.    z    P>z     [95% Conf.    Interval]
               
smoke
smoker         1.25    .8114691    0.34    0.731      .350212    4.461584
_cons    .5714286    .1601748    -2.00    0.046     .3298869    .9898259