web-dev-qa-db-ja.com

MATLABを使用した単純なバイナリロジスティック回帰

単純な分類問題のためにMATLABを使用してロジスティック回帰を行うことに取り組んでいます。私の共変量は0から1の範囲の1つの連続変数ですが、カテゴリカル応答は0(正しくない)または1(正しい)の2値変数です。

ロジスティック回帰を実行して、入力観測値(上記の連続変数など)が正しいか正しくない確率を出力する予測子を確立しようとしています。これはかなり単純なシナリオですが、MATLABでこれを実行するのに問題があります。

私のアプローチは次のとおりです。連続変数の値を含む1つの列ベクトルXと、Yの各値の既知の分類(0または1など)を含む別の同じサイズの列ベクトルXがあります。私は次のコードを使用しています:

[b,dev,stats] = glmfit(X,Y,'binomial','link','logit');

ただし、これにより、_p = 1.000_、非常に高い係数(b)(-650.5、1320.1)、および1e6のオーダーの関連する標準誤差値で無意味な結果が得られます。

次に、追加のパラメーターを使用して、二項サンプルのサイズを指定してみました。

glm = GeneralizedLinearModel.fit(X,Y,'distr','binomial','BinomialSize',size(Y,1));

これにより、私が期待していたよりも一致した結果が得られました。係数を抽出し、glmvalを使用して推定値を作成し(Y_fit = glmval(b,[0:0.01:1],'logit');)、フィッティング用の配列を作成しました(X_fit = linspace(0,1))。 figure, plot(X,Y,'o',X_fit,Y_fit'-')を使用して元のデータとモデルのプロットをオーバーレイすると、モデルの結果のプロットは、ロジスティック回帰プロットで一般的な「S」字型プロットの下1/4のようになりました。

私の質問は次のとおりです。

1)glmfitを使用すると奇妙な結果が得られたのはなぜですか?
2)最初の質問にどのように対処すればよいですか。入力値が与えられた場合、その分類が正しい確率はどれくらいですか。
3)モデルパラメータの信頼区間を取得するにはどうすればよいですか? glmvalstatsからのglmfit出力を入力できるはずですが、glmfitを使用しても正しい結果が得られません。

コメントや入力はとても役に立ちます、ありがとう!

更新(3/18/14)

mnrvalが妥当な結果をもたらすように思われることがわかりました。 [b_fit,dev,stats] = mnrfit(X,Y+1);を使用できます。ここで、_Y+1_は、単にバイナリ分類子を名目上の分類子にします。

[pihat,lower,upper] = mnrval(b_fit,loopVal(ii),stats);をループして、さまざまなpihat確率値を取得できます。ここで、loopVal = linspace(0,1)または適切な入力範囲と `ii = 1:length(loopVal) 'です。

statsパラメーターには大きな相関係数(0.9973)がありますが、_b_fit_のp値は0.0847と0.0845であり、解釈方法がよくわかりません。何かご意見は?また、私の例では、なぜmrnfitglmfitに対して機能するのでしょうか。 _GeneralizedLinearModel.fit_を使用した場合の係数のp値は両方とも_p<<0.001_であり、係数の推定値もかなり異なっていたことに注意する必要があります。

最後に、dev関数からのmnrfit出力をどのように解釈しますか? MATLABドキュメントには、「解ベクトルでの近似の逸脱度です。逸脱度は、残差平方和の一般化です」と記載されています。これはスタンドアロン値として役立ちますか、それとも他のモデルのdev値とのみ比較されますか?

9
chex

データは線形分離可能であるようです。つまり、入力データは1次元であるため、_x < xDiv_のすべての値が1つのクラス(たとえば_y = 0_)とすべての値に属するようなxの値が存在することを意味します。 _x > xDiv_のは他のクラス(_y = 1_)に属しています。

データが2次元の場合、これは、特定のクラスのすべてのインスタンスが線の片側にくるように、2次元空間Xを通る線を引くことができることを意味します。

LRは、データが線形分離可能である問題に対処することを実際には意図していないため、これはロジスティック回帰(LR)にとって悪いニュースです。

ロジスティック回帰は、次の形式の関数を適合させようとしています。

Logistic Regression

これは、分母の指数内の式が負の無限大または無限大にある場合にのみ、_y = 0_または_y = 1_の値を返します。

これで、データは線形分離可能であり、MatlabのLR関数はデータに適合する最尤法を見つけようとするため、極端な重み値が得られます。

これは必ずしも解決策ではありませんが、データポイントの1つだけでラベルを反転してみてください(したがって、一部のインデックスtここで、y(t) == 0 set y(t) = 1)。これにより、データが線形分離可能でなくなり、学習された重み値が劇的にゼロに近づきます。

3
Ryan J. Smith