Comment construire des modèles linéaires ou non linéaires avec des réponses contraintes (somme des sorties = 1) dans JMP ?J'ai souvent besoin de modéliser des variables de réponse continues qui représentent des proportions entre les catégories, où les réponses pour chaque échantillon doivent totaliser 1 (par exemple, P1=10%, P2=25%, P3=35%, P4=30%).
En Python, j'utilise une couche de sortie softmax pour faire respecter la contrainte de somme égale à un.
- Comment puis-je construire de tels modèles dans JMP (linéaires ou de réseaux neuronaux) tout en m'assurant que la somme des réponses prédites est égale à 1 ?
- Existe-t-il un flux de travail recommandé (par exemple, régression logistique multinomiale, réseaux neuronaux avec des fonctions de lien appropriées) ?
- Enfin, puis-je obtenir un Profiler qui affiche les proportions prévues pour chaque catégorie (similaire au Profiler catégoriel affichant les probabilités de classe) ?
Merci d'avance pour vos conseils ou exemples !
Modélisation statistique avancéeRe: Comment construire des modèles linéaires ou non linéaires avec des réponses contraintes (somme des sorties = 1) dans JMP ?Salut,
Une façon très simple de faire ce que vous recherchez consiste à créer une colonne de réponse nominale correspondant à la valeur y la plus élevée et à l'ajuster aux x à l'aide d'une régression logistique nominale (voir tableau ci-joint).
Cela répond-il à vos besoins ? Pourriez-vous m’expliquer précisément quel est le cas d’utilisation ? Que représentent ces données et quel est l’objectif de cette analyse ?
Re: Comment construire des modèles linéaires ou non linéaires avec des réponses contraintes (somme des sorties = 1) dans JMP ?Salut Hadley,
Merci pour votre aide. Malheureusement, votre suggestion ne répond pas tout à fait à mon besoin précis.
Mon objectif : je dois prédire des résultats avec une contrainte selon laquelle la somme est égale à 1 — ceci est courant lors de la modélisation des proportions de population ou des formulations de mélanges en fonction de leurs propriétés.
Ma solution : j’ai implémenté manuellement une transformation logarithmique centrée (CLR). Le flux de travail est le suivant :
- Transformer les sorties en espace logarithmique centré
- Ajuster le modèle aux variables transformées
- Appliquez la transformation inverse pour garantir le respect de la contrainte.
Voici le code de la transformation :
<SPAN>// Adjust zeros </SPAN><SPAN>epsilon = 0.0000001; </SPAN><SPAN>p1_adj = If(:p1 == 0, epsilon, :p1); </SPAN><SPAN>p2_adj = If(:p2 == 0, epsilon, :p2); </SPAN><SPAN>pk_adj = If(:pk == 0, epsilon, :pk); </SPAN>
<SPAN>// Scaling </SPAN><SPAN>sum_adj = p1_adj + p2_adj + ... + pk_adj; </SPAN><SPAN>p1_norm = p1_adj / sum_adj; </SPAN><SPAN>p2_norm = p2_adj / sum_adj; </SPAN><SPAN>pk_norm = pk_adj / sum_adj; </SPAN>
<SPAN>// Geometric mean </SPAN><SPAN>geom_mean = (p1_norm * p2_norm * ... * pk_norm)^(1/k); </SPAN>
<SPAN>// CLR transformation </SPAN><SPAN>y1_clr = Log(p1_norm / geom_mean); </SPAN><SPAN>y2_clr = Log(p2_norm / geom_mean); </SPAN><SPAN>yk_clr = Log(pk_norm / geom_mean); </SPAN>
<SPAN>// Inverse transformation (after prediction) </SPAN><SPAN>sum_exp = Exp(:y1_clr_pred) + Exp(:y2_clr_pred) + ... + Exp(:yk_clr_pred); </SPAN><SPAN>p1_pred = Exp(:y1_clr_pred) / sum_exp; </SPAN><SPAN>p2_pred = Exp(:y2_clr_pred) / sum_exp; </SPAN><SPAN>pk_pred = Exp(:yk_clr_pred) / sum_exp;</SPAN>
Demande supplémentaire : J’aimerais également utiliser le Profiler pour afficher les proportions empilées de chaque sortie, comme le fait la régression logistique nominale pour afficher les probabilités empilées de chaque étiquette. Votre solution permet la visualisation par empilement, mais elle ne prédit que la probabilité de la catégorie la plus élevée, et non la proportion exacte de chaque sortie.
Vous trouverez ci-joint un exemple de transformation manuelle à titre de référence.
Cordialement,