Salut la communauté JMP,
J'ai besoin de calculer la zone signée sous la courbe pour des données de séries chronologiques simples (voir les données fictives ci-dessous).

Plus précisément, je dois calculer la zone (comme indiqué dans les graphiques ci-dessus) au-dessus de zéro comme positif et en dessous de zéro comme négatif, y compris le décalage local de positif à négatif et réciproquement.
Exemples:
- AUC pour la courbe A = Zone positive 1 + Zone négative 2 + Zone positive 3
- AUC pour la courbe C = Zone positive 1 + Zone négative 2
- AUC pour la courbe E = Zone positive 1
La fonction Polygon Area () ne semble pas gérer correctement les séries chronologiques plus complexes, probablement en raison des segments croisés. De plus, cette fonction ne renvoie pas la valeur signée pour la zone. Connaissez-vous un complément ou une fonction que je pourrais utiliser pour atteindre mon objectif ?
Merci.
Meilleur,
TS
Règle du trapèze ?
Names default to here(1);
dt = current data table();
x_col = Column(dt, "Time (Week)");
y_col = Column(dt, "Y");
by_col = Column(dt, "Curve");
auc = function({x_col, y_col, by_col},
{DEFAULT LOCAL},
Summarize(dt, by_values=By(by_col));
areas = [=>];
for(i=1, i<=nitems(by_values), i++,
by_value = by_values[i];
rows = dt << Get Rows Where(by_col[]==by_value); // get he rows for the curve
x_values = x_col[rows];
r = rank(x_values); // make sure it's ordered right
x_values = x_values[r];
y_values = y_col[rows][r];
n = nitems(x_values);
//trapezoid rule
x_1 = x_values[1::n-1];
x_2 = x_values[2::n];
y_1 = y_values[1::n-1];
y_2 = y_values[2::n];
x_intervals = abs(x_2 - x_1);
y_avg = (y_2 + y_1)/2;
area = sum(x_intervals :*</img> y_avg);
areas[by_value] = area
);
return(areas);
);
areas = auc(x_col, y_col, by_col);
show(areas); // areas = ["A" => 10.5, "B" => -7.5, "C" => -16.5, "D" => 6, "E" => 24];
De plus, ce que vous faites n'est pas un polygone (au cas où vous l'utiliseriez ailleurs pour des choses similaires).L'aire d'un polygone ne peut jamais être négative, sinon elle n'existerait pas.
L'exemple dans l'index de script vous montre ce qu'il fait.
Names Default To Here( 1 );
area = Polygon Area( {0, 0}, {0, 10}, {10, 10}, {10, 0} );
Il ferme la boucle (dans ce cas un carré) entre {10, 0} et {0, 0}.L'aire du polygone est donc de 100.Peu importe où vous placez cela dans le plan x/y.L'aire d'un carré 10x10 devrait être de 100.
Names Default To Here( 1 );
area = Polygon Area( {-100, -100}, {-100, -90}, {-90, -90}, {-90, -100} );
show(area); //100