Simple régression logistique binaire à l'aide de MATLAB
Je suis en train de travailler sur une régression logistique à l'aide de MATLAB pour un simple problème de classement. Mon co-variable est une variable continue comprise entre 0 et 1, tandis que ma réponse catégorique est une variable binaire de 0 (faux) ou 1 (correct).
Je suis à la recherche d'exécuter une régression logistique pour établir un prédicteur qui serait sortie de la probabilité de certains d'observation (par exemple, la variable continue comme décrit ci-dessus) est correcte ou incorrecte. Bien que ce soit assez simple scénario, j'ai un peu de difficulté de l'exécution de cette dans MATLAB.
Mon approche est la suivante: j'ai un vecteur colonne X
qui contient les valeurs de la variable continue, et un autre de même taille vecteur colonne Y
qui contient le connu classement de chaque valeur de X
(par exemple 0 ou 1). Je suis en utilisant le code suivant:
[b,dev,stats] = glmfit(X,Y,'binomial','link','logit');
Cependant, cela me donne des résultats insensés avec un p = 1.000
, les coefficients (b
) qui sont extrêmement élevés (-650.5, 1320.1), et l'erreur-type des valeurs de l'ordre de 1e6.
J'ai ensuite essayé en utilisant un paramètre supplémentaire pour spécifier la taille de mon binôme de l'échantillon:
glm = GeneralizedLinearModel.fit(X,Y,'distr','binomial','BinomialSize',size(Y,1));
Cela m'a donné des résultats qui n'étaient plus en adéquation avec ce que j'attendais. J'ai extrait les coefficients utilisés glmval
pour créer des estimations (Y_fit = glmval(b,[0:0.01:1],'logit');
), et créé un tableau pour le montage (X_fit = linspace(0,1)
). Quand j'ai superposé les parcelles de l'origine des données et le modèle à l'aide de figure, plot(X,Y,'o',X_fit,Y_fit'-')
, la parcelle du modèle essentiellement regardé comme le plus faible 1/4ème de la " S " en forme de la parcelle qui est typique avec de la régression logistique parcelles.
Mes questions sont les suivantes:
1) Pourquoi mon utilisation de glmfit
donner des résultats étranges?
2) Comment dois-je aller à répondre à ma question de départ: compte tenu de certains de la valeur d'entrée, quelle est la probabilité que sa classification est correcte?
3) Comment puis-je obtenir des intervalles de confiance pour mon paramètres du modèle? glmval
devrait être en mesure de saisir le stats
sortie de glmfit
, mais mon utilisation de glmfit
n'est pas de donner des résultats corrects.
Tous les commentaires et l'entrée serait très utile, merci!
Mise à JOUR (3/18/14)
J'ai trouvé que mnrval
semble donner des résultats raisonnables. Je peux utiliser [b_fit,dev,stats] = mnrfit(X,Y+1);
où Y+1
simplement fait mon classificateur binaire dans un nominal.
Je peux faire une boucle par [pihat,lower,upper] = mnrval(b_fit,loopVal(ii),stats);
pour obtenir diverses pihat
valeurs de probabilité, où loopVal = linspace(0,1)
ou certains approprié d'entrée de gamme et `ii = 1:length(loopVal)'.
La stats
paramètre a un grand coefficient de corrélation (0.9973), mais les valeurs de p pour b_fit
sont 0.0847 et 0.0845, dont je ne suis pas tout à fait sûr de savoir comment les interpréter. Toutes les pensées? Aussi, pourquoi mrnfit
travail sur glmfit
dans mon exemple? Je dois dire que les p-valeurs pour les coefficients lors de l'utilisation de GeneralizedLinearModel.fit
étaient à la fois p<<0.001
, et les estimations des coefficients ont été très différents.
Enfin, comment interpréter le dev
sortie de la mnrfit
fonction? Le MATLAB document stipule qu'il est "la déviance de l'ajustement à la solution de vecteur. La déviance est une généralisation de la somme résiduelle des carrés". Est-ce utile comme un stand-alone de la valeur, ou est-ce seulement par rapport à dev
valeurs à partir d'autres modèles?
OriginalL'auteur chex | 2014-03-19
Vous devez vous connecter pour publier un commentaire.
Cela ressemble à vos données peuvent être linéairement séparable. En bref, cela signifie que depuis votre entrée de données est à une dimension, qu'il existe une certaine valeur de
x
tels que toutes les valeurs dex < xDiv
appartiennent à une seule classe (disonsy = 0
) et toutes les valeurs dex > xDiv
appartenir à l'autre classe (y = 1
).Si vos données ont été à deux dimensions, cela signifie que vous pouvez tracer une ligne à partir de votre espace à deux dimensions
X
tels que toutes les instances d'une classe donnée sont sur un côté de la ligne.C'est de mauvaises nouvelles pour la régression logistique (LR) que LR n'est pas vraiment destiné à faire face à des problèmes où les données sont linéairement séparables.
De régression logistique est en essayant d'intégrer une fonction de la forme suivante:
Cela ne fera que les valeurs de retour de
y = 0
ouy = 1
lorsque l'expression au sein de l'exponentielle dans le dénominateur est négatif de l'infini ou de l'infini.Maintenant, parce que vos données sont linéairement séparables, et Matlab LR fonction tente de trouver un maximum de vraisemblance ajustement pour les données, vous obtiendrez poids extrême valeurs.
Ce n'est pas forcément une solution, mais essayez de le faire pivoter les étiquettes sur l'un de vos points de données (donc pour certains index
t
oùy(t) == 0
ensembley(t) = 1
). Ce sera la cause de vos données afin de ne plus être linéairement séparable et l'ont appris les valeurs de poids sera déplacé de façon spectaculaire proche de zéro.Retournement de l'étiquette serait certainement une solution rapide comme votre coefficients peuvent changer considérablement selon le type d'étiquette que vous flip. Vous pouvez essayer Discriminante Linéaire classificateur, qui fonctionne bien dans le cas linéairement séparable et pouvez-vous donner une classe-mesure de probabilité conditionnelle.
OriginalL'auteur Ryan J. Smith