Régression segmentée<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Est-ce que quelqu'un sait comment effectuer une régression segmentée et calculer le point d'arrêt (là où les 2 lignes se rencontrent) sur JMP ?
Re : Régression segmentéePour ceux qui n'ont pas vu ça, voici un blog potentiellement utile écrit par mon collègue @JerryFish sur la façon de construire et de manipuler l'ajustement par morceaux dans JMP (à l'aide de la plateforme non linéaire) : Solutions non linéaires par morceaux, partie 3 : Utilisation de l'éditeur de formules de JMP pour résoudre des paramètres inconnus.
J'inclus ceci ici car cela s'inscrit bien dans cette discussion.
Re : Régression segmentéeJ'ai essayé cela récemment, cela a plus de sens pour moi que l'utilitaire de plateforme non linéaire.Je serais intéressé de comprendre comment le schéma d'itération converge vers ma solution ?J'ai essayé de choisir une valeur raisonnable de d (le seuil) pour mes données, et cela a semblé mieux fonctionner lorsque j'ai "verrouillé" la valeur de d et cliqué de nouveau sur le bouton "Go" dans la fenêtre de dialogue de la plateforme générée à partir du Plateforme non linéaire lancée à l'aide de :
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );
partie du code.
Existe-t-il un moyen simple de modifier ce court script pour appeler une table de données à la place ? (de saisir manuellement les valeurs pour X et Y) ?
Je suis sûr qu'il s'agit d'une "question JSL Novice", donc je m'excuse d'avance.....
J'ai pris cela de manière grossière et j'ai copié-collé simplement ce qui suit dans ma datatable enregistrée avec les colonnes, {X, Y, Ypred} et mes données renseignées :
Parameter( {a = 5, b = 45, c = -100, d = 0.109}, a + b * :X + c * (:X - d) * (:X > d) );
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );et c'est ainsi que je suis arrivé à mon résultat pour mes données !Merci encore pour cette contribution à la communauté.
Re : Régression segmentéeMerci je vais essayer ça !
Re : Régression segmentéeComme le suggère Dodo, une régression par morceaux peut être effectuée avec la plateforme non linéaire. Vous trouverez ci-dessous un exemple basé sur l'exemple de bâton cassé ci-dessus.
New Table( "piecewise",
Add Rows( 20 ),
New Column( "X",
Continuous,
Set Values( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] )
),
New Column( "Y",
Numeric,
Set Values( [15, 12, 27, 31, 26, 31, 42, 47, 56, 56, 47, 46, 36, 44, 38, 35, 34, 35, 25, 19] )
),
New Column( "Ypred",
Numeric,
Formula( Parameter( {a = 20, b = 1, c = -10, d = 10}, a + b * :X + c * (:X - d) * (:X > d) ) )
)
);
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );
Re : Régression segmentéeS'il s'agit d'une simple relation de bâton brisée, vous pouvez faire quelque chose comme ceci :
// Create a broken stick relationship with some noise;
x = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
y = [15, 12, 27, 31, 26, 31, 42, 47, 56, 56, 47, 46, 36, 44, 38, 35, 34, 35, 25, 19];
expr_FX = expr(a + b*x + c*(x-d):*(x>d));
expr_SSE = expr(sum((y-expr_FX)^2));
// Supply a set of starting values;
a = 20; b = 1; c = -10; d = 15;
print("Starting values:");
show(a, b, c, d);
sse = minimize(expr_SSE, {a, b, c, d}, << tolerance(1e-5));
print("Final estimates:");
show(a, b, c, d);
show(eval(expr_FX));
J'ai basé ce qui précède sur l'exemple des moindres carrés du manuel JMP 10, chapitre 8, en remplaçant une relation de bâton brisé dans l'expression par le modèle exponentiel de l'exemple.Le point d'arrêt sera le paramètre d, car c'est la valeur x à laquelle la pente de la ligne change.Notez que lorsque vous multipliez les deux matrices (xd) et (x>d) ensemble, vous aurez besoin du produit élément par élément
par opposition à une simple multiplication.Vous aurez également probablement besoin d’une valeur de départ relativement bonne pour le point d’arrêt afin que l’expression converge.Dans cet exemple, toutes les sorties sont écrites dans le journal.
Vraisemblablement, cela pourrait également être configuré dans la plate-forme non linéaire (Analyse | Modélisation | Non linéaire), mais je ne l'ai pas encore essayé car je ne suis pas très familier avec l'utilisation de formules dans les tableaux de données.Est-ce que cela vous aide?