Commit 840b3505 authored by pfreon's avatar pfreon
Browse files

Minor changes (addition data.CLI, cosmetic changes)

Addition of 4 dataCLI for testing cases where the range of V values is <2 with or without max value < 100.
Cosmetic changes in the displayed texts of Cadre_Modele.java & Global.java
Improvement of the management of the number of decimals on X & Y axis of graphs; the decision is made only according to the range of values. This range is get from the statistical table in Data.stat when possible.
Addition in Modele.java of a message if the initial value of a parameter is equal to infinity.
Cosmetic changes in the contents of some Help files.
parent 3abfe9b9
Years;Catches;Effort;Environment
1962;122000;516.949152542373;4.13
1963;121000;983.739837398374;2.83
1964;134000;1098.3606557377;2.39
1965;163000;1012.42236024845;3.3
1966;258600;1114.65517241379;4.02
1967;225200;1057.27699530516;2.83
1968;187700;1048.60335195531;2.74
1969;193200;995.876288659794;3.14
1970;200700;1329.13907284768;3.18
1971;228200;1584.72222222222;3.15
1972;206100;1675.60975609756;2.66
1973;151404;1627.68595041322;1.8
1974;290400;1781.59509202454;3.51
1975;282300;2313.93442622951;2.73
1976;305100;2480.48780487805;1.79
1977;200000;2100.94871794872;2.0
1978;210000;2200.52173913043;1.6
1979;254300;2270.53571428571;2.29
1980;266200;2218.33333333333;2.5
Years;Production;Effort;Environment
1985.000000;284441.000000; 82.700000; 33.1
1986.000000; 223432.000000; 84.300000; 33.0
1987.000000; 149161.000000; 58.900000; 33.025
1988.000000; 189166.000000; 78.300000; 32.7
1989.000000; 149672.000000; 65.100000; 32.9
1990.000000; 87206.000000; 35.500000; 33.0
1991.000000; 87690.000000; 33.600000; 33.30000
1992.000000; 31912.000000; 11.400000; 33.17500
1993.000000; 35864.000000; 8.900000; 32.97500
1994.000000; 61097.000000; 11.700000; 32.6250000
1995.000000; 59383.000000; 10.300000; 32.8000
1996.000000; 56867.000000; 19.300000; 33.22500
1997.0;70000.0;120.0;1.5
Years;Production;Effort;Environment
1985.000000;284441.000000; 82.700000; 33.1
1986.000000; 223432.000000; 84.300000; 33.0
1987.000000; 149161.000000; 58.900000; 33.025
1988.000000; 189166.000000; 78.300000; 32.7
1989.000000; 149672.000000; 65.100000; 32.9
1990.000000; 87206.000000; 35.500000; 33.0
1991.000000; 87690.000000; 33.600000; 33.30000
1992.000000; 31912.000000; 11.400000; 33.17500
1993.000000; 35864.000000; 8.900000; 32.97500
1994.000000; 61097.000000; 11.700000; 32.6250000
1995.000000; 59383.000000; 10.300000; 32.8000
1996.000000; 56867.000000; 19.300000; 33.22500
1997.0;70000.0;120.0;32.5
Years;Production;Effort;Environment
1985.000000;284441.000000; 82.700000; 303.1
1986.000000; 223432.000000; 84.300000; 303.0
1987.000000; 149161.000000; 58.900000; 303.025
1988.000000; 189166.000000; 78.300000; 302.7
1989.000000; 149672.000000; 65.100000; 302.9
1990.000000; 87206.000000; 35.500000; 303.0
1991.000000; 87690.000000; 33.600000; 303.30000
1992.000000; 31912.000000; 11.400000; 303.17500
1993.000000; 35864.000000; 8.900000; 302.97500
1994.000000; 61097.000000; 11.700000; 302.6250000
1995.000000; 59383.000000; 10.300000; 302.8000
1996.000000; 56867.000000; 19.300000; 303.22500
1997.0;70000.0;120.0;302.5
......@@ -130,7 +130,6 @@ public class Cadre_Modele extends JDialog {
tmcolumn = t.getColumnModel().getColumn(i);
tmcolumn.setMinWidth(50);
}
}
private void renseignerModele() {
......@@ -149,21 +148,21 @@ public class Cadre_Modele extends JDialog {
break;
case RechercheModele.mixte:
if (Global.effort_preponderant == 1) {
jTextAreaModele.setText("Knowing the relationship between CPUE and E is " + RechercheModele.getCpue_ERelation());
jTextAreaModele.setText("Knowing that the model CPUE = f(E) is " + RechercheModele.getCpue_ERelation());
jTextAreaModele.append("\n");
jTextAreaModele.append("Knowing the environmental effect is " + Global.environmental_influence);
jTextAreaModele.append("\n\t");
jTextAreaModele.append("The rule governing the relationship between residual CPUE and V is " + RechercheModele.getCpue_VRelation());
jTextAreaModele.append("Knowing the environment influences " + Global.environmental_influence);
jTextAreaModele.append("\n");
jTextAreaModele.append("Knowing that the relationship between residual CPUE and V is " + RechercheModele.getCpue_VRelation());
jTextAreaModele.append("\n\t");
jTextAreaModele.append("A possible global model could be " + RechercheModele.getEquation());
jTextAreaModele.append("A possible mixed model could be " + RechercheModele.getEquation());
} else {
jTextAreaModele.setText("Knowing the relationship between CPUE and V is " + RechercheModele.getCpue_VRelation());
jTextAreaModele.setText("Knowing the relationship CPUE = f(V) is " + RechercheModele.getCpue_VRelation());
jTextAreaModele.append("\n");
jTextAreaModele.append("Knowing the environmental effect is " + Global.environmental_influence);
jTextAreaModele.append("\n\t");
jTextAreaModele.append("The rule governing the relationship between residual CPUE and E is " + RechercheModele.getCpue_ERelation());
jTextAreaModele.append("Knowing the environment influences " + Global.environmental_influence);
jTextAreaModele.append("\n");
jTextAreaModele.append("Knowing that the model CPUE resisudals = f(E) is " + RechercheModele.getCpue_ERelation());
jTextAreaModele.append("\n\t");
jTextAreaModele.append("A possible global model could be " + RechercheModele.getEquation());
jTextAreaModele.append("A possible mixed model could be " + RechercheModele.getEquation());
}
break;
default:
......
......@@ -370,7 +370,7 @@ public class Cadre_Question extends JFrame
Modele.Estimer();
}
Cadre_Modele dlg = new Cadre_Modele(this);
dlg.setTitle("Climprod : The model " + RechercheModele.getEquation() + " is selected and fitted");
dlg.setTitle("Climprod: The model " + RechercheModele.getEquation() + " is selected and fitted");
// deprecated
//dlg.show();
dlg.setVisible(true);
......
......@@ -3,7 +3,8 @@
* Lecture des données du fichier *.CLI, recheche d'erreurs ou insuffisance,
* calcul de la CPUE et des statistiques de base (sans décalage),
* prend en compte les décalages temporels lorsque nécessaire,
* affiche les graphiques de base sur les données brutes avec décalage si nécessaire.
* affiche les graphiques de base (time plots, bivariate plots) sur les
* données brutes avec décalage si nécessaire.
*/
package fr.ird.climprod;
......@@ -25,7 +26,7 @@ public class Data {
private static double[] v;
private static double[] vbar;
private static int decalmax = 0;
private static double[][] stat = new double[10][4];
public static double[][] stat = new double[10][4];
private static Object[][] dataTable;
private static Object[][] dataCorrelation;
......@@ -72,8 +73,8 @@ public class Data {
}
existFile = true;
init_val();
makePlot(false);
statistiques();
makePlot(false);
makeDataTable();
makeCorrelationTable(); // Coefficient de correlation sur les rangs de Spearman (Rho)
} catch (Exception e) {
......@@ -83,9 +84,9 @@ public class Data {
}
/**
* Retourne le nombre de donnes
* Retourne le nombre de données
*
* @return un entier reprsentant le nombre d'annes de donnes ou -1 si
* @return un entier représentant le nombre d'années de données ou -1 si
* fichier non valide
*/
public static int getNbYears() {
......@@ -99,7 +100,7 @@ public class Data {
/**
* Retourne le nom complet du fichier
*
* @return un String reprsentant le nom complet du fichier ou null si
* @return un String représentant le nom complet du fichier ou null si
* fichier non valide
*/
public static String getFileName() {
......@@ -111,7 +112,7 @@ public class Data {
}
/**
* Retourne les donnes d'origine
* Retourne les données d'origine
*
* @return un double[][] ou null si fichier non valide
*/
......@@ -338,7 +339,11 @@ public class Data {
private static void makePlot(boolean lag) {
if (lag) {
/* ************** Lag plot ******************************/
/* ************** Lag plot *****************************
******* CPUE versus E (E weighted if relevant) *********
*** and CPUE versus V (V lagged if relevant) ***********
*******************************************************/
for (int i = 0; i < 2; i++) {
Global.lagPlot[i] = new Plot();
}
......@@ -349,25 +354,22 @@ public class Data {
Global.lagPlot[i].setTitreGraphique(Global.titreG[i + 12]);
Global.lagPlot[i].setTitreX("Weighted " + Global.titreSx[i + 10]);
Global.lagPlot[i].setTitreY(Global.titreSy[i + 10]);
double max = Math.abs(Global.lagPlot[i].getMaxAxeX() - Global.lagPlot[i].getMinAxeX());
if (max > 10) {
Global.lagPlot[i].setDecimalsurX(0);
}
max = Math.abs(Global.lagPlot[i].getMaxAxeY() - Global.lagPlot[i].getMinAxeY());
if (max > 10) {
Global.lagPlot[i].setDecimalsurY(0);
}
if (Data.stat[8][i+2] > 100) Global.lagPlot[i].setDecimalsurX(0); // si range E ou V > 100. Modif 2021.
else Global.lagPlot[i].setDecimalsurX(2);
if (Data.stat[8][1] > 100) Global.lagPlot[i].setDecimalsurY(0); // si range CPUE > 100. Modif 2021.
else Global.lagPlot[i].setDecimalsurY(2);
}
} else {
/**
/**********************************************************
* ***************** time plot *****************************
*/
**********************************************************/
double minx = Stat1.min(Data.year);
PlotSerie[] ps = new PlotSerie[4];
ps[2] = new PlotSerie("x", Data.year, "y", Data.yexp);
ps[3] = new PlotSerie("x", Data.year, "y", Data.pue);
ps[0] = new PlotSerie("x", Data.year, "y", Data.f);
ps[1] = new PlotSerie("x", Data.year, "y", Data.v);
ps[0] = new PlotSerie("x", Data.year, "y", Data.yexp);
ps[1] = new PlotSerie("x", Data.year, "y", Data.pue);
ps[2] = new PlotSerie("x", Data.year, "y", Data.f);
ps[3] = new PlotSerie("x", Data.year, "y", Data.v);
for (int i = 0; i < 4; i++) {
Global.timePlot[i] = new Plot();
ps[i].setFigure(2);
......@@ -375,21 +377,22 @@ public class Data {
Global.timePlot[i].setTitreGraphique(Global.titreG[i]);
Global.timePlot[i].setTitreX(Global.titreSx[i]);
Global.timePlot[i].setTitreY(Global.titreSy[i]);
Global.timePlot[i].setDecimalsurX(0);
Global.timePlot[i].setDecimalsurX(0); // Years
Global.timePlot[i].setMinAxeX(minx - 1);
Global.timePlot[i].setpasX(2.0d);
double max = Math.abs(Global.timePlot[i].getMaxAxeY() - Global.timePlot[i].getMinAxeY());
if (max > 10) {
Global.timePlot[i].setDecimalsurY(0);
}
//System.out.println("timePlot i=" + i + " Data.stat[8][i] = " + Data.stat[8][i]);
if (Data.stat[8][i] > 100) Global.timePlot[i].setDecimalsurY(0);
else Global.timePlot[i].setDecimalsurY(2);
//Global.timePlot[i].ShowLegend=true;
}
/**
* **************** Distribution plot ********************************
*/
* ********* Distribution plot (histograms) **************************
* *****utilisé dans 'Select the appropriate model' ******************
****(mais pas ceux du Jackknife qui figurent dans Validation.java****
* ******************************************************************/
for (int i = 0; i < 4; i++) {
double[][] zz = new double[10][2];
double[][] zz = new double[10][2]; // Table des valeurs des X [0] et Y [1] des 10 [0->9] classes des histogrammes.
double[] val = new double[10];
double[] etiq = new double[10];
String[] etiq$ = new String[10];
......@@ -412,8 +415,11 @@ public class Data {
break;
}
DecimalFormat df = new DecimalFormat("0.##");
if (zz[0][0] >= 100) {
//System.out.println("i=" + i + " zz[0][0] = " + zz[0][0] + " zz[0][1] = " + zz[0][1]);
//System.out.println("zz[9][0] = " + zz[9][0] + " zz[9][1] = " + zz[9][1]);
DecimalFormat df = new DecimalFormat("0.##"); // Gestion des décimales sur axe X des histogrammes
double range = Math.abs(zz[9][0] - zz[0][0]);
if (range > 100) {
df = new DecimalFormat("0");
}
for (int j = 0; j < zz.length; j++) {
......@@ -426,15 +432,15 @@ public class Data {
Global.distriPlot[i].setValeurs(psd);
Global.distriPlot[i].setTitreGraphique(Global.titreG[i + 4]);
Global.distriPlot[i].setTitreX(Global.titreSx[i + 4]);
Global.distriPlot[i].setTitreY(Global.titreSy[i + 4]);
Global.distriPlot[i].setTitreY(Global.titreSy[i + 4]);
Global.distriPlot[i].setDecimalsurY(0);
Global.distriPlot[i].setpasY(1.d);
Global.distriPlot[i].setMaxAxeY(psd.getMaxY());
}
/* ********************** Scatter plot *************************
************* Y vs E (unlagged), Y vs V (unlagged),************
************* CPUE vs E (unlagged), CPUE vs V (unlagged) ******
/* ********************** Scatter plot *****************************
************* Y vs E (unlagged), Y vs V (unlagged),****************
************* CPUE vs E (unlagged), CPUE vs V (unlagged) **********
*/
for (int i = 0; i < 4; i++) {
Global.scatterPlot[i] = new Plot();
......@@ -449,25 +455,26 @@ public class Data {
Global.scatterPlot[i].setTitreGraphique(Global.titreG[i + 8]);
Global.scatterPlot[i].setTitreX(Global.titreSx[i + 8]);
Global.scatterPlot[i].setTitreY(Global.titreSy[i + 8]);
double max = Math.abs(Global.scatterPlot[i].getMaxAxeX() - Global.scatterPlot[i].getMinAxeX());
// double max = Math.abs(Global.scatterPlot[i].getMaxAxeX() - Global.scatterPlot[i].getMinAxeX() + (Global.scatterPlot[i].getMaxAxeX() / 20)); // Modif. 2020. Ne change rien?
if (max > 10) {
Global.scatterPlot[i].setDecimalsurX(0);
}
max = Math.abs(Global.scatterPlot[i].getMaxAxeY() - Global.scatterPlot[i].getMinAxeY());
if (max > 10) {
Global.scatterPlot[i].setDecimalsurY(0);
}
double range = Math.abs(Global.scatterPlot[i].getMaxAxeX() - Global.scatterPlot[i].getMinAxeX());
if (range > 100) Global.scatterPlot[i].setDecimalsurX(0);
else Global.scatterPlot[i].setDecimalsurX(2);
range = Math.abs(Global.scatterPlot[i].getMaxAxeY() - Global.scatterPlot[i].getMinAxeY());
if (range > 100) Global.scatterPlot[i].setDecimalsurY(0);
else Global.scatterPlot[i].setDecimalsurY(2);
}
/* ************** Indépendance plot *************************/
/* ***************** Indépendance plot *************************
* ********utilisé dans 'Select the appropriate model' *********
* *************************************************************/
Global.indePlot = new Plot();
Global.indePlot.setValeurs(new PlotSerie("Environement (V)", Data.v, "Effort (E)", Data.f));
Global.indePlot.setTitreGraphique(Global.titreG[14]);
if (Data.stat[8][3] > 100) Global.indePlot.setDecimalsurX(0);
else Global.indePlot.setDecimalsurX(2);
if (Data.stat[8][2] > 100) Global.indePlot.setDecimalsurY(0);
else Global.indePlot.setDecimalsurY(2);
}
}
/*
......
......@@ -114,7 +114,7 @@ public class EquationModele {
case 19: // CPUE=a.V.exp(b.V.E) MODELE CAPTURABILITE
puec = par[0] * vv * Math.exp(par[1] * vba * ff);
break;
case 20: // CPUE=a.exp(b.E)+c.V+d MODELE ABONDANCE
case 20: // CPUE=a.exp(b.E)+c.V+d MODELE ABONDANCE ADDITIF (impossible reformuler en a+bV+c exp(d E), cf commentaire dans Model.java, initialisation)
puec = par[0] * Math.exp(par[1] * ff) + par[2] * vba + par[3];
break;
case 21: // CPUE=(a.V+b.V^2).exp(c.E) MODELE ABONDANCE
......@@ -156,7 +156,7 @@ public class EquationModele {
case 27: // CPUE=a.V^(1+b)+c.V^(2+b)+d.V^(2.b).E MODELE LINEAIRE QUADRATIQUE CAPTURABILITE + ABONDANCE.
tmp1 = Math.pow(vv, par[1]);
tmp2 = Math.pow(vba, par[1]);
puec = par[0] * tmp1 * vba + par[2] * (vba * vba) * tmp1 + par[3] * tmp1 * tmp2 * ff; // OK
puec = par[0] * tmp1 * vba + par[2] * (vba * vba) * tmp1 + par[3] * tmp1 * tmp2 * ff; // Formulation vérifiée (X^(a+b) = X^a . X^b)
break;
case 28: // CPUE=a.V^b.exp(c.V^d.E) MODELE ABONDANCE
puec = par[0] * Math.pow(vba, par[1]) * Math.exp(par[2] * Math.pow(vba, par[3]) * ff);
......@@ -169,7 +169,7 @@ public class EquationModele {
tmp1 = Math.pow(vv, par[1]);
tmp2 = Math.pow(vba, par[1]);
// AVANT: puec = (par[1] * tmp1 * vba + par[0] * tmp1 * (vba * vba)) * Math.exp(par[3] * tmp2 * ff);
puec = (par[0] * tmp1 * vba + par[2] * (vba * vba) * tmp1) * Math.exp(par[3] * tmp2 * ff);
puec = (par[0] * tmp1 * vba + par[2] * (vba * vba) * tmp1) * Math.exp(par[3] * tmp2 * ff); // Formulation vérifiée (X^(a+b) = X^a . X^b)
break;
}
return (puec);
......
......@@ -98,13 +98,12 @@ public class Global {
*/
static double fF, r_jk;
static String fFsignif$;
static String [] message$ ={"","","","","","","",""};
static String [] message$ ={"","","","","","","","","","","","","",""};
static int Min_95_Noteworthy_MSE;
static int Min_95_Noteworthy_MSY;
static int Max_95_Noteworthy_MSE;
static int Max_95_Noteworthy_MSY;
static int[] AllPredictedNegative = new int[5];
static int AllPredictedNegativeTot;
static int[] AllPredictedNegative = new int[5];
static int Flag_pb_jackknife_Tot;
static int[] Flag_pb_jackknife=new int[4];
static boolean test_jackknife;
......@@ -128,7 +127,7 @@ static int AllPredictedNegativeTot;
static String datafilePath = System.getProperty("user.home");
/**
* ************ Modle en cours *************
* ************ Modèle en cours *************
*/
static int typeModele; // Type Simple-Climat-Mixte
static int relationCPU_E; // Type relation entre CPU et E
......@@ -141,19 +140,20 @@ static int AllPredictedNegativeTot;
static double critereAIC; // Akaike
static double critereAIC_Corr; // Akaike corrigé
static double critereBIC;
static boolean validationOk; // true si Validation ex�cut�e
static boolean modelisationOk; // true si mod�le ajust�
static boolean validationOk; // true si Validation exécutée
static boolean modelisationOk; // true si mod�le ajusté
static boolean MSY_MSE_OK; // true si pas d'anomalie dans résultats MSY et MSE (boolean ne marche pas avec boolean b4 dans CadreMain.java)
static int Compteur_erreurs_Jackknife; // Rajout 2020.
static String Texte_erreur_jackknife$; // Rajout 2020.
/**
* *********** Plots ************************
*/
//static int[] typePlot = {2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2,2,2,2,2};
//static Hashtable htPlot=new Hashtable();
static String[] titreG = {"E Time Plot", "V Time Plot", "Y Time Plot", "CPUE Time Plot", "E Distribution", "V Distribution", "Y Distribution", "CPUE Distribution", "Y vs E (unlagged)", "Y vs V (unlagged)", "CPUE vs E (unlagged)", "CPUE vs V (unlagged)", "CPUE versus E (E weighted if relevant)", "CPUE versus V (V lagged if relevant)","E versus V (unlagged)", "Observed and Fitted CPUE (lag effect if relevant)", "Time Plot of residual CPUE (lag effect if relevant)", "Residual CPUE versus E (E weighted if relevant)", "Residual CPUE versus V (V lagged and weighted if relevant)", "a (%) Time Plot (lag effect if relevant)", "b (%) Time Plot (lag effect if relevant)", "c (%) Time Plot (lag effect if relevant)", "d (%) Time Plot (lag effect if relevant)", "R2 (%) Time Plot", "Function Y=f(V & E) (lagged if relevant)", "Function Y=f(V & E) (E weighted if relevant)", "Function CPUE=f(V & E)(E weighted if relevant)", "Function CPUE=f(V & E) (E weighted if relevant)", "MSY versus V", "MSE versus V"};
//static int[] typePlot = {2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2,2,2,2,2};
//static Hashtable htPlot=new Hashtable();
static String[] titreG = {"Y Time Plot", "CPUE Time Plot", "E Time Plot", "V Time Plot", "E Distribution", "V Distribution", "Y Distribution", "CPUE Distribution", "Y vs E (unlagged)", "Y vs V (unlagged)", "CPUE vs E (unlagged)", "CPUE vs V (unlagged)", "CPUE versus E (E weighted if relevant)", "CPUE versus V (V lagged if relevant)","E versus V (unlagged)", "Observed and Fitted CPUE (lag effect if relevant)", "Time Plot of residual CPUE (lag effect if relevant)", "Residual CPUE versus E (E weighted if relevant)", "Residual CPUE versus V (V lagged and weighted if relevant)", "a (%) Time Plot (lag effect if relevant)", "b (%) Time Plot (lag effect if relevant)", "c (%) Time Plot (lag effect if relevant)", "d (%) Time Plot (lag effect if relevant)", "R2 (%) Time Plot", "Function Y=f(V & E) (lagged if relevant)", "Function Y=f(V & E) (E weighted if relevant)", "Function CPUE=f(V & E)(E weighted if relevant)", "Function CPUE=f(V & E) (E weighted if relevant)", "MSY versus V", "MSE versus V"};
static String[] titreSx = {"Year", "Year", "Year", "Year", "Classes", "Classes", "Classes", "Classes", "Effort (E)", "Environment (V)", "Effort (E)", "Environment (V)", "Environment (V)", "Year", "Year", "Effort (E)", "Environment (V)", "Year", "Year", " Year", "Year", "Year", "Weighted effort (E)", "Weighted effort (E)", "Weighted effort (E)", " Weighted effort (E)", "Environment (V)", "Environment (V)"};
static String[] titreSy = {"Effort (E)", "Environment (V)", "Catches (Y)", "CPUE ", "Nb", "Nb", "Nb", "Nb", "Catches (Y)", "Catches (Y)", "CPUE", "CPUE", "CPUE", "CPUE", " Residual", "Residual", "Residual", "a (%)", "b (%)", "c (%)", "d (%)", "R² (%)", "Catches (Y)", "Catches (Y)", "CPUE", "CPUE", "MSY", "MSE"};
static String[] titreSy = {"Catches (Y)", "CPUE ", "Effort (E)", "Environment (V)", "Nb", "Nb", "Nb", "Nb", "Catches (Y)", "Catches (Y)", "CPUE", "CPUE", "CPUE", "CPUE", " Residual", "Residual", "Residual", "a (%)", "b (%)", "c (%)", "d (%)", "R² (%)", "Catches (Y)", "Catches (Y)", "CPUE", "CPUE", "MSY", "MSE"};
static Plot[] timePlot = new Plot[4];
static PlotModal[] distriPlot = new PlotHisto[4];
......@@ -279,8 +279,8 @@ static int AllPredictedNegativeTot;
critereAIC = 0;
critereAIC_Corr = 0;
modelisationOk = false;
validationOk = false; // true si Validation excute
//bavard=true;
validationOk = false; // true si Validation exécutée
//bavard=true;
questionDic.clear();
answerDic.clear();
warningDic.clear();
......
package fr.ird.climprod;
/* ******************************************************************
*******Definition of the Main() method (Java entry point)
*******Definition of the Main() method (Java entry point) ********
*******and size of the main frame ********************************
******************************************************************
*/
......@@ -21,7 +22,7 @@ public class Main {
frame.validate();
}
UtilCadre.leftResize(frame, 95, 95);
UtilCadre.leftResize(frame, 95, 95); // Resize of the main frame (cadre principal).
frame.setVisible(true);
}
......
/**
* Titre : Climprod<p>
* Appelle et lance les graphiques serie, bivariees et histogramme pour réponse à questions graphiques
/* Titre : Climprod<p>
* Appelle et lance les graphiques serie, bivariees et histogrammes
* (sauf ceux lancés dans Data.java) pour réponse à questions graphiques
* au debut des questions du menu "Select the appropriate model and fit it".
* Lances ces graphiques
* Ajuste un modèle par l'algorithme de Marquardt par la méthode marquart() quis se trouve dans Validation.java
*
*/
* Ajuste un modèle par l'algorithme de Marquardt par la méthode marquart() qui
* se trouve dans Validation.java */
package fr.ird.climprod;
import static fr.ird.climprod.Data.getNbDataRetenue;
import static fr.ird.climprod.Data.getNbYears; // Addition 2020.
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.*;
import java.awt.Color;
public class Modele {
......@@ -27,7 +27,7 @@ public class Modele {
static private int nbYears; // Addition 2020.
static private double lambda;
static private int nbre_par;
static private int riter, iter, ritertot;
static private int iter, riter, ritertot;
static private double val_init, val_fin, ecart;
static private double r,sompar, variance_pue, yy, aic, aic_corr, bic;
......@@ -66,10 +66,14 @@ public class Modele {
variance_pue = Stat1.var(pue, false) * nim;
//calc_var();
calcul_val_init();
double PosInfinity = Double.POSITIVE_INFINITY;
double NegInfinity = Double.NEGATIVE_INFINITY;
Global.message$[12] = "";
for (int i = 0; i < nbre_par; i++) {
par_init[i] = par_alors[i]; // Valeur initiale paramètre pour une estimation des valeurs initiales du modèle simplifié initial (sans constante) avant ajustement du modèle final incluant une constante. Comment. 2020
}
if (par_alors[i] == PosInfinity || par_alors[i] == NegInfinity)
Global.message$[12] = "The estimate of the initial value of at least one of the parameter is equal to infinity.\nThis is likely due to a poor fitting of the model. As a result, the plots related to\nmodelling are not shown.\n\n";
}
//System.out.println( "Avant marquardt");
//for(int i=0;i<nbre_par;i++)System.out.print( par_alors[i]+" ");
// System.out.println();
......@@ -78,7 +82,7 @@ public class Modele {
String message2 = "";
sompar = somme_residus(par_alors);
// System.out.println("sompar = " + sompar);
System.out.println("iter = " + iter + " maxrit = " + maxrit + " ritertot = " + ritertot);
System.out.println("iter = " + iter + " ritertot = " + ritertot);
if (iter >= maxrit-1) {
message2 = "No convergence after" + maxrit + " iterations. I stop volontary the algorithm.";
message2 = message2
......@@ -142,7 +146,7 @@ public class Modele {
message = message
+ "\n -age at the begining of the environmental influence; \n -age at the end of the environmental influence; \n are correct.\n\n";
message = message
+ "It is strongly recommanded that you stop here the procedure.";
+ "If so, it is strongly recommanded that you stop here the procedure.";
MsgDialogBox msg = new MsgDialogBox(0, message, 1, Global.CadreMain);
}
else
......@@ -501,7 +505,7 @@ public class Modele {
inverse_gauss();
par_alors[0] = Math.exp(par_alors[0]);
break;
case 20: // CPUE=a.exp(b.E)+c.V+d
case 20: // CPUE=a.exp(b.E)+c.V+d MODELE ABONDANCE ADDITIF (impossible reformuler en a+bV+c exp(d E) du fait que les paramètres de l'initialisation doivent être les premiers).
nbre_par = 2;
for (k = 0; k < nim; k++) {
ptmp[0] = 1;
......@@ -1000,13 +1004,15 @@ public class Modele {
Global.fittedCpuePlot[i].setTitreX(Global.titreSx[13 + i]);
Global.fittedCpuePlot[i].setTitreY(Global.titreSy[13 + i]);
Global.fittedCpuePlot[i].setDecimalsurX(0); // Pas de décimale car années en X. Comment 2020.
if (Data.stat[8][1] > 100) Global.fittedCpuePlot[i].setDecimalsurY(0); // stat[8][1] = Etendue CPUE. Avant setDecimalsurX(0) -> pas de décilmale sur axe des X. Avec setDecimalsurX(1) -> décimales SI NECESSAIRE. Modif 2020
else Global.fittedCpuePlot[i].setDecimalsurY(2); // Modif 2021.
Global.fittedCpuePlot[i].setMinAxeX(minx - 1);
Global.fittedCpuePlot[i].setpasX(2.0d);
}
/**
* ****************** residuals plot **************************
* i = 0 pour Résidus CPUE = f(E)
* i = 0 pour Résidus CPUE = f(V)
* i = 1 pour Résidus CPUE = f(V)
*/
for (int i = 0; i < 2; i++) {
......@@ -1019,9 +1025,15 @@ public class Modele {
Global.residualsPlot[i].setTitreGraphique(Global.titreG[i + 17]);
Global.residualsPlot[i].setTitreX(Global.titreSx[i + 15]);
Global.residualsPlot[i].setTitreY(Global.titreSy[i + 15]);
Global.residualsPlot[i].setDecimalsurX(1); // setDecimalsurX(0) -> pas de décilmale sur axe des X. Avec setDecimalsurX(1) -> décimales SI NECESSAIRE en principe. Modif 2020.
//System.out.println("i = " + i + " Data.stat[7][i+2] = " + Data.stat[7][i+2] + " Data.stat[6][i+2] = " + Data.stat[6][i+2] + " max = " + max);
if (Data.stat[8][i+2] >100) Global.residualsPlot[i].setDecimalsurX(0); // stat[8][i+2] = Etendue E puis V. Avant setDecimalsurX(0) -> pas de décilmale sur axe des X. Avec setDecimalsurX(1) -> décimales SI NECESSAIRE. Modif 2020.
else Global.residualsPlot[i].setDecimalsurX(2); // En compélent de autre méthode dans Plot.java. Modif 2021.
// setDecimalsurX(0) -> pas de décilmale sur axe des X. Avec setDecimalsurX(1) -> décimales. Modif 2021.
// ajusteExtremas de Plot.java: selon valeur booléenne (vrai ou faux) applique ou non l'ajustement
// surX, sur X et met ou non le minimum à zéro sur Y et sur Y
// surX, sur X et met ou non le minimum à zéro sur Y et sur Y
if (Data.stat[8][1] > 50) Global.residualsPlot[i].setDecimalsurY(0); // stat[8][1] = Etendue CPUE (comme substitut de résidus CPUE; 50 au lieu de 100 car résidus et valeurs positives et négartives). Avant setDecimalsurX(0) -> pas de décilmale sur axe des X. Avec setDecimalsurX(1) -> décimales SI NECESSAIRE. Modif 2020.
else Global.residualsPlot[i].setDecimalsurY(2); // Modif 2021.
//System.out.println("Data.stat[7][1] = " + Data.stat[7][1]);
Global.residualsPlot[i].ajusteExtremas(false, false, false, false); // seconde valeur boolénne changée de true en false. Modification 2020
// Cette modification évite un écrasement des valeurs de Y autours de l'axe des X.
Global.residualsPlot[i].setXcutYat(0.0d);
......@@ -1030,7 +1042,8 @@ public class Modele {
/**
* *********************Three-variate plot ******************************
* ********(or bi-variate + prediction when CPUE = f(E) or f(V)**********
**/
***********************************************************************/
double pasx, pasy, minix, miniy, maxix, maxiy, xx, yy;
double[] estim1 = new double[nim+1];
double[] estim2 = new double[nim+1];
......@@ -1079,16 +1092,16 @@ public class Modele {
// for (int j = 0; j < 4; j++) System.out.println("j= " + j + "; par_alors[j]= " + par_alors[j]);
for (int j = 0; j < 5; j++) { // Boucle des j: j=0 Vmini; j=2 Vmiddle; j=4 Vmaxi (ou Predicted CPUE & Y si CPUE=f(E)); j=1 et j=2 rien ne se passe (sinon estimations inutilisées de CPUE et Y);
MSE[j]= EquationModele.minimum_fonction(yy,par_alors);
MSY[j]= MSE[j] * EquationModele.fonction_modele(MSE[j],yy,yy,par_alors); // Calcul des MSY à partir de paramètres non-jackknife pour valeurs remarquables de V (Y = CPUE * E).
//System.out.println("j= " + j + "; MSE[j]= " + MSE[j]); // Calcul des MSE pour valeurs remarquables de V.
//System.out.println("j= " + j + "; MSY[j]= " + MSY[j]); // Calcul des MSY pour valeurs remarquables de V.
Global.AllPredictedNegative[j] = 0;
MSE[j]= EquationModele.minimum_fonction(yy,par_alors);
MSY[j]= MSE[j] * EquationModele.fonction_modele(MSE[j],yy,yy,par_alors); // Calcul des MSY à partir de paramètres non-jackknife pour valeurs remarquables de V (Y = CPUE * E).
//System.out.println("j= " + j + "; MSE[j]= " + MSE[j]); // Calcul des MSE pour valeurs remarquables de V.
//System.out.println("j= " + j + "; MSY[j]= " + MSY[j]); // Calcul des MSY pour valeurs remarquables de V.
Global.AllPredictedNegative[j] = 0;
for (int i = 0; i < (nim+1); i++) { // Attention la longueur de la boucle = nim (nb data retenues) mais les valeurs sont calculées pour un pas fixe de E (pasx)
// fonction_modele(double ff, double vv, double vba, double par[])
estim1[i] = EquationModele.fonction_modele(xx, yy, yy, par_alors); // Valeur prédites des CPUEs; xx = effort; yy = V.
estim2[i] = xx * estim1[i];
if (estim1[i] <= 0) Global.AllPredictedNegative[j] = Global.AllPredictedNegative[j] + 1; // Valeur predites des Ys.
if (estim1[i] <= 0) Global.AllPredictedNegative[j] = Global.AllPredictedNegative[j] + 1; // Valeur predites des Ys.
//System.out.println("j = " + j + " i = " + i + " estim1[i] = " + estim1[i] + " AllPredictedNegative[j] == " + Global.AllPredictedNegative[j]);
tabxx[i] = xx;
//System.out.println("i = " + i + " estim1[i] = " + estim1[i] + " estim2[i] = " + estim2[i] + " yy = " + yy);
......@@ -1141,39 +1154,36 @@ public class Modele {
yy = yy + pasy;
}
Global.variatePlot[0].setMinAxeX(0.0);
Global.variatePlot[1].setMinAxeX(0.0);