SAS Institute Japan株式会社 JMPジャパン事業部でシニアテスターをしています小野と申します。
私のほうで勘違いしていて的外れかもしれませんが、以下に、現段階で私のほうで個人的に思い付いた点を申し上げます。
■特に1番目の質問については、<結果が毎回、異なる>ということなので、何かおかしなことが起こっているのではないかと私は思います。(なお、連続尺度の説明変数が1つだけの「ロジスティックプロット」では、Y座標を決めるのに乱数が使われています。しかし、少なくともJMP15以降では、固定の乱数シード値が使われているため、実行のたびにプロットの見た目が異なるということはないはずです。また、ロジスティック回帰のその他の数値結果では乱数は使われておらず、以下で述べる2つの状況以外であれば、かつ、同じデータでかつ同じ設定であれば、数理的な理由により、どの統計ソフトウェアでも、少なくとも最尤推定の点推定値は同じになるはずですし同じになるべきです。)もし以下の返信が的外れな場合には、レポートのどの数値結果の箇所が毎回、違っているかを教えてもらえないでしょうか? また、スクリプトを利用して分析を再実行してみても、やはり毎回、数値結果が異なったものになるのか確認してもらえないでしょうか?
■ごく一般的には、JMPの「モデルのあてはめ」では、以下の点に注意が必要かと思います。
Point1: もしご質問が<JMPの結果が他の統計ソフトウェアと違う>ということであれば、JMPでは効果コーディング(effect coding)という方法が使われている点に注意する。
Point2: JMPの結果(の一部)は、列に設定された「尺度」によって変わる点に注意する。
Point3: JMPの結果(の一部)は、「値の表示順序」によっても変わる点に注意する。
Point4: スクリプトを活用すれば、マウス操作を行わないで、同じ分析を再実行できる。
<詳細>
二値・順序・名義の応答変数に対するロジスティック回帰分析は、次の2つの場合を除き、大域的な解が1つだけしか存在しません。
(1) 説明変数の間に1次独立が存在する場合
たとえば、X1, X2, X3という3変数の間に、X1 + X2 = X3といった関係がある場合や、標本サイズが説明変数の個数よりも少ない場合などです。この場合、パラメータ推定値は一意に定まりません。
(2) 分離(separation)が存在する場合
この場合、パラメータ推定値が+∞ もしくは-∞になります。つまり、パラメータ推定値が存在しません。
逆にこれら2つ以外の状況では、二値・順序・名義の応答変数に対するロジスティック回帰分析は、一意な解が存在します。よって、データおよびモデル設定が同じであれば、上記の2つ以外の状況であれば、たとえ別の統計ソフトウェアを使っていたとしても(*1)、数値誤差の範囲で、少なくとも点推定値(最尤推定によって得られる点推定値)は同じになるべきであり同じになるはずです。また、少なくともJMPのロジスティック回帰分析は最適化の過程において乱数を用いていません(*2)ので、その点でも、データと設定が同じであれば、かつ、同じバージョンのJMPであれば、まったく同じになるべきですし同じになるはずです(*3)。
(*1)ただし、別のソフトウェアで「ロジスティック」を行うルーチンでも、通常のロジスティック回帰分析ではなく、L1ノルムやL2ノルムの罰則付き尤度をデフォルトで用いるものもあります。また、後述の(b)で述べているように、カテゴリカルな説明変数に対するコーディングの違いで、パラメータ推定値は異なる場合があります。さらに、最尤推定に対する検定には、Wald検定・尤度比検定・スコア検定という3種類があり、どの検定を採用しているかによって、検定や信頼区間は異なります。
(*2) ただし、連続尺度の説明変数が1つだけの場合に描かれる「ロジスティックプロット」では、Y座標を決めるのには乱数が使われています。しかし、少なくともJMPバージョン15以降では、固定の乱数シード値が使われているために、実行のたびに結果が変わるということはないはずです。現在のバージョン(18.2)のヘルプは、以下のURLで見ることができます。
(*3) ただし、データが処理時間によって、効果に対してデフォルトで実行される検定が尤度比検定になったり、Wald検定になったりします。現在のバージョン(18.2)については、以下のURLでより詳細が説明されています。
しかし、3つほど注意してほしい点(落とし穴)があります((a)~(c)) 。
(a) JMPでは、データの数値が同じであっても、データテーブルに設定された尺度(連続尺度・順序尺度・名義尺度)によってグラフや統計分析の結果は変わります。
(b) JMPにおいて、説明変数に対するコーディングは(特に名義尺度に対するコーディングでは)、製造業や工業統計学でよく採用されている方法が採用されています。このコーディングは「効果コーディング(effect coding)」と呼ばれており、たとえば、男性と女性では、名義尺度の場合、次のようにコーディングされます。
男性 1
男性 1
女性 -1
女性 -1
女性 -1
もしくは、
男性 -1
男性 -1
女性 1
女性 1
女性 1
また、3値の名義尺度の場合にはたとえば次のようにコーディングされます。
愛媛 1 0
愛媛 1 0
香川 0 1
徳島 -1 -1
徳島 -1 -1
徳島 -1 -1
(名義尺度に対してこのような効果コーディングを行った場合、パラメータ推定値は、「中間的な設定」からのズレを表します。製造業や工業統計学においては、名義尺度の変数であっても元々は連続尺度のものが多く、現在の工程での設定からのズレを問題にすることが多いため、このようなコーディングがよく使われていると思われます。)
順序尺度の説明変数に対しては、また違ったコーディングが使われています。
(c) データを並び替えたときに最後に来る水準が(名義尺度のコーディングで)"-1"となります。また、「値の表示順序」列プロパティによって、その最後に来る水準を変更できます。(上記の例では、徳島が最後に表示されるカテゴリーとしている時の例です。)
(b)と(c)での違いによって、パラメータ推定値は変わります。しかし、(b)と(c)での設定が違っていも、データ全体の適合度(「モデル全体の検定」・「あてはめの詳細」・「あてはまりの悪さ(LOF)」)は変わりません。
なお、JMPにおいては、「スクリプト」もしくは「JMPスクリプト言語(JMP Scripting Language; JSL)」と呼ばれているものに、分析処理を保存させることができます。レポートの最上部にある赤い三角ボタンのメニューから、スクリプトを保存できます。JMPバージョン18であれば、レポートの赤い三角ボタン > [スクリプトの保存]で、データテーブルに保存するには[データテーブルへ]を選択します。この操作でデータテーブルの左上にスクリプトが保存されます。この機能を使えば、マウス操作をすることなしに、分析を再現できます。
(特にJMP18からは「ワークフロービルダー」という機能が追加され、より広範囲なマウス操作を記録することができるようになりました。)
■2
SomersのDも、いわゆる「負の相関係数」がある場合には(PearsonやKendallの相関係数が負になるように)負になります。たとえば、以下のデータではSomersのDやKendallのτbが負になっています。
dt1 = New Table("Test1",
New Column("X", Ordinal, Values([1,1,1,2,2,2,3,3,3])),
New Column("Y", Ordinal, Values([1,2,3,1,2,3,1,2,3])),
New Column("度数", Values([9,8,7, 6,5,2, 4,3,1]))
);
dt1 << Contingency(
Y( :Y ),X( :X ), Freq( :度数 ),
Measures of Association( 1 )
);
このスクリプトを実行するには、まず、JMPのプルダウンメニューの[ファイル] > [新規作成]> [JSLスクリプト](Windows版JMP18の場合)を選択します。そして、呼び出されたスクリプトウィンドウにて、上記のスクリプトをコピペします。コピペした後、プルダウンメニューの[編集]> [スクリプトの実行]を選択します。
上記の■1における(c)とも関係するのですが、この結果はデータの並び順によって変わります。何もしないデフォルトの状態であれば、データを並び替えた順番(もしアルファベットならばA,B,C順、数字ならば1,2,3順)で「小さいもの」と「大きいもの」が定義されます。
この順番は列プロパティの[値の表示順序]で変更できます。(かなり昔のバージョンでは、この[値の表示順序]は、別のオプション名となっています。)
(1) データテーブルにて、列の列見出しを右クリックし、[列情報]を選択する。
(2) [列プロパティ]コンボボックスをクリックし、[値の表示順序]を選択する。
(3) もし、値が小さい順から大きい順に並んでいない場合には、値を選択した後、上下の矢印(↑や↓)で順序を変更する。
(4) 表示順序を変更した後は、画面右上の[OK]ボタンをクリックして列情報ウィンドウを閉じる。
たとえば、以下はデータの数値自体は上記のデータとまったく同じですが、値の表示順序が違うために(X変数で、「3」が一番小さく、「1」が一番大きいと定義しています)、上記の結果とは違い、SomersのDやKendallのτbが正となっています。(以下のスクリプトは、現在のJMP 18にて作成したものです。昔のバージョンでは、期待通りに動作しない可能性があります。)
dt2 = New Table( "Test2",
New Column( "X", "Ordinal",
Set Property( "Value Order", {Custom Order( {3, 2, 1} )} ),
Values( [1, 1, 1, 2, 2, 2, 3, 3, 3] )
),
New Column( "Y","Ordinal",
Set Property( "Value Order", {Custom Order( {1, 2, 3} )} ),
Set Values( [1, 2, 3, 1, 2, 3, 1, 2, 3] )
),
New Column( "度数",
Set Values( [9, 8, 7, 6, 5, 2, 4, 3, 1] )
)
);
dt2 << Contingency(
Y( :Y ),X( :X ), Freq( :度数 ),
Measures of Association( 1 )
);
SomersのDは負になりえます(最小値は-1です)。
また、間違った分析になっているかどうかを確認するには、レポートの分割表を見て、値が小さいほうから大きいほうに並んでいるかを確認してください。もし自分の思ったように並んでいないようでしたら、データテーブルのほうで列プロパティの[値の表示順序]で表示順序を変更する必要があります。