単純な分類問題のために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)モデルパラメータの信頼区間を取得するにはどうすればよいですか? glmval
はstats
からのglmfit
出力を入力できるはずですが、glmfit
を使用しても正しい結果が得られません。
コメントや入力はとても役に立ちます、ありがとう!
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であり、解釈方法がよくわかりません。何かご意見は?また、私の例では、なぜmrnfit
がglmfit
に対して機能するのでしょうか。 _GeneralizedLinearModel.fit
_を使用した場合の係数のp値は両方とも_p<<0.001
_であり、係数の推定値もかなり異なっていたことに注意する必要があります。
最後に、dev
関数からのmnrfit
出力をどのように解釈しますか? MATLABドキュメントには、「解ベクトルでの近似の逸脱度です。逸脱度は、残差平方和の一般化です」と記載されています。これはスタンドアロン値として役立ちますか、それとも他のモデルのdev
値とのみ比較されますか?
データは線形分離可能であるようです。つまり、入力データは1次元であるため、_x < xDiv
_のすべての値が1つのクラス(たとえば_y = 0
_)とすべての値に属するようなx
の値が存在することを意味します。 _x > xDiv
_のは他のクラス(_y = 1
_)に属しています。
データが2次元の場合、これは、特定のクラスのすべてのインスタンスが線の片側にくるように、2次元空間X
を通る線を引くことができることを意味します。
LRは、データが線形分離可能である問題に対処することを実際には意図していないため、これはロジスティック回帰(LR)にとって悪いニュースです。
ロジスティック回帰は、次の形式の関数を適合させようとしています。
これは、分母の指数内の式が負の無限大または無限大にある場合にのみ、_y = 0
_または_y = 1
_の値を返します。
これで、データは線形分離可能であり、MatlabのLR関数はデータに適合する最尤法を見つけようとするため、極端な重み値が得られます。
これは必ずしも解決策ではありませんが、データポイントの1つだけでラベルを反転してみてください(したがって、一部のインデックスt
ここで、y(t) == 0
set y(t) = 1
)。これにより、データが線形分離可能でなくなり、学習された重み値が劇的にゼロに近づきます。