source: trunk/src/MSGanalysiscrossvalidation.m @ 327

Last change on this file since 327 was 327, checked in by pinsard, 13 years ago

change svn properties

  • Property svn:keywords set to URL
File size: 11.5 KB
Line 
1function [result] = MSGanalysiscrossvalidation(ij_intensity_concat, ij_cumul_concat, time_intensity_concat, time_cumul_concat, Longitudes, Latitudes, lonmin, lonmax, latmin, latmax)
2
3%MSGANALYSISCROSSVALIDATION est une fonction permettant de faire la
4%validation des relations entre les intensites issus de l'analyse des
5%temperature de brillance par MSG et les precipitations d'apres EPSAT. Pour
6%cela, des donnees aleatoires sont prises dans un domaine donnee et un
7%diagramme de dispersion permet de trouver la formule reliant les deux
8%grandeurs. Cette formule est ensuite appliquee a un autre echantillon
9%aleatoire pour la valider.
10
11%
12%+
13%
14% =============================
15% MSGanalysiscrossvalidation.m
16% =============================
17%
18% .. function:: MSGanalysiscrossvalidation(ij_intensity_concat, ij_cumul_concat, time_intensity_concat, time_cumul_concat, Longitudes, Latitudes, lonmin, lonmax, latmin, latmax)
19%
20% DESCRIPTION
21% ===========
22%
23% - Donnees d'entrees :
24%
25%   * ij_intensity_concat : Matrice comportant les donnees d'intensites et
26%     dont les dimensions sont temps, longitudes, latitudes.
27%   * ij_cumul_concat : Matrice contenant les donnees de precipitations
28%     EPSAT cumulees et dont les dimensions sont temps, longitudes,
29%     latitudes.
30%   * time_intensity_concat : Variable temporelle des donnees d'intensites,
31%     en jour julien.
32%   * time_cumul_concat : Variable temporelle des donnees de
33%     precipitations, en jour julien.
34%   * Longitudes : Variable de longitudes des donnees de precipitations et
35%     d'intensites.
36%   * Latitudes : Variable de latitudes des donnees de precipitations et
37%     d'intensites.
38%   * lonmin : Borne inferieure en longitude des donnees selectionnees pour
39%     le test et la validation.
40%   * lonmax : Borne superieure en longitude des donnees selectionnees pour
41%     le test et la validation.
42%   * latmin : Borne inferieure en latitude des donnees selectionnees pour
43%     le test et la validation.
44%   * latmax : Borne superieure en longitude des donnees selectionnees pour
45%     le test et la validation.
46%
47% Cette fonction permet de faire la validation des relations entre les
48% intensites issus de l'analyse des temperature de brillance par MSG et les
49% precipitations d'apres EPSAT. Pour cela, des donnees aleatoires sont
50% prises dans un domaine donnee et un diagramme de dispersion permet de
51% trouver la formule reliant les deux grandeurs. Cette formule est ensuite
52% appliquee a un autre echantillon aleatoire pour la valider.
53%
54% EXAMPLES
55% ========
56%
57% Voir la 'demo'.
58%
59% SEE ALSO
60% ========
61%
62% :func:`cumulEPSAT_concat`
63% :func:`intensityMSG_concat`
64% :func:`uniquerand`
65% :func:`generalscatterplot`
66%
67% :func:`int2precip`
68%
69% :func:`extractedmatrixdata`
70%
71% TODO
72% ====
73%
74% coding rules and describe demo
75%
76% fplod 20110804T121502Z aedon.locean-ipsl.upmc.fr (Darwin)
77%
78% matlab 7.4 cratos
79%  Warning: Divide by zero.
80%
81% octave 3.4 cratos
82%  Analyse du nuage 1 sur 1 vs  Analyse du nuage 1 sur n sous matlab 7.4
83%  ...
84%  invalid conversion from NaN to logical
85%
86%
87% find a equivalent to matlab refline
88%
89% EVOLUTIONS
90% ==========
91%
92% $Id$
93%
94% $URL$
95%
96% - fplod 20110804T121216Z aedon.locean-ipsl.upmc.fr (Darwin)
97%
98%   * add result
99%   * octave and matlab 7.4 (zeus) do not like [argout1,~, argout3]=myfunc() so
100%     replace ~ by temporary variable
101%   * no call to refline when octave running
102%
103% - jaclod 2011-07-29
104%
105%   * Ajout de la documentation et de la demonstration.
106%
107% - jaclod 2011-07-28
108%
109%   * Creation.
110%
111%-
112global application
113%
114result=-1;
115
116%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
117% Extraction des donnees de la zone d'interet
118%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
119
120[ij_intensity_concat, time_intensity_concat,  dim2extracted, dim3extracted] = extractedmatrixdata(ij_intensity_concat, time_intensity_concat, Longitudes, Latitudes, min(time_intensity_concat(:)), max(time_intensity_concat(:)), lonmin, lonmax, latmin, latmax);
121clear dim2extracted
122clear dim3extracted
123[ij_cumul_concat, time_cumul_concat, dim2extracted, dim3extracted] = extractedmatrixdata(ij_cumul_concat, time_cumul_concat, Longitudes, Latitudes, min(time_intensity_concat(:)), max(time_intensity_concat(:)), lonmin, lonmax, latmin, latmax);
124clear dim2extracted
125clear dim3extracted
126
127%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128
129
130%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
131% Suppression de jours eventuels de donnees 'NaN'
132%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
133
134% Suppressions des donnees pour les jours ou nous avons que des 'NaN'.
135% On cherche s'il y en a, quels sont les pas de temps concernes et leur
136% nombre. On commence par les donnees d'intensites.
137indnan = find(isnan(ij_intensity_concat(:,1,1)));
138nbnan = size(indnan,1);
139
140% S'il y en a, on va les supprimer.
141if ~isempty(indnan);
142   
143    % On boucle pour supprimer chaque pas de temps concernes en commencant
144    % par les derniers (si on souhaite par exemple supprimer les pas de
145    % temps 2 et 5 et que l'on supprime le 2 d'abord, le 5e pas de temps
146    % sera ensuite decale au 4e. En commencant par la fin, cela ne se
147    % produit pas).
148    for nansuppr = 1 : nbnan;
149       
150        ij_intensity_concat(indnan(nbnan - nansuppr + 1),:,:) = [];
151       
152        time_intensity_concat(indnan(nbnan - nansuppr + 1)) = [];
153       
154    end
155   
156end
157
158clear('indnan','nbnan','nansuppr');
159
160% De meme pour les donnees EPSAT.
161indnan = find(isnan(ij_cumul_concat(:,1,1)));
162nbnan = size(indnan,1);
163
164if ~isempty(indnan);
165   
166    for nansuppr = 1 : nbnan;
167       
168        ij_cumul_concat(indnan(nbnan - nansuppr + 1),:,:) = [];
169       
170        time_cumul_concat(indnan(nbnan - nansuppr + 1)) = [];
171       
172    end
173   
174end
175
176clear('indnan','nbnan','nansuppr');
177
178%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
179
180
181%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
182% Recuperation des donnees existantes pour MSG et EPSAT
183%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
184
185% On passe d'informations sur la date et l'heure en des informations
186% uniquement sur la date (jour julien entier).
187time_intensity_concat = fix(time_intensity_concat);
188time_cumul_concat = fix(time_cumul_concat);
189
190% On ne garde que les jours commums.
191time_concat = intersect(time_intensity_concat,time_cumul_concat);
192
193% Nombre de jours en communs.
194nbjour = size(time_concat,2);
195
196% Initialisation des matrices contenant pour MSG et EPSAT, les indices
197% temporelles des donnees des jours en commun a recuperer.
198indrecupMSG = zeros(1,nbjour);
199indrecupEPSAT = zeros(1,nbjour);
200
201for jour = 1 : nbjour;
202   
203    % On cherche quel est l'indice du jour dans les donnees temporelles
204    % pour chacun des cas.
205    indrecupMSG(1,jour) = find(time_intensity_concat == time_concat(jour));
206    indrecupEPSAT(1,jour) = find(time_cumul_concat == time_concat(jour));
207   
208end
209
210% On recupere seulement ces donnees.
211ij_intensity_concat = ij_intensity_concat(indrecupMSG,:,:);
212ij_cumul_concat = ij_cumul_concat(indrecupEPSAT,:,:);
213
214clear('time_intensity_concat','time_cumul_concat','nbjour','jour','indrecupMSG','indrecupEPSAT');
215
216%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
217
218
219%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
220% Fabrication des jeux de donnees
221%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
222
223% Selection de 10 000 points uniques aleatoirements pour les donnees de
224% test et de validation.
225nbpoints = size(ij_intensity_concat,1)*size(ij_intensity_concat,2)*size(ij_intensity_concat,3);
226[indtest] = uniquerand(10000,1,nbpoints);
227[indvalid] = uniquerand(10000,1,nbpoints);
228
229% Recuperation des donnees correspondant aux points selectionnes.
230datatestMSG = ij_intensity_concat(indtest);
231datatestEPSAT = ij_cumul_concat(indtest);
232datavalidMSG = ij_intensity_concat(indvalid);
233datavalidEPSAT = ij_cumul_concat(indvalid);
234
235% Calcul du nombre de donnees se recouvrant.
236allind = cat(2,indtest,indvalid);
237recover = 20000 - size(unique(allind),2);
238
239% Calcul du pourcentage de donnees se retrouvant dans les deux jeux.
240pcrecover = recover / 10000 * 100;
241
242% Affichaque d'un message d'information pour connaitre le pourcentage de
243% donnees se recouvrant sur les deux jeux de donnees.
244disp([num2str(recover) ' points se retrouvent dans le test et la validation, soit ' num2str(pcrecover) ' pour cent des donnees dans chaque diagramme.']);
245
246clear('nbpoints','indtest','indvalid','allind','recover');
247
248%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
249
250% Ouverture d'une figure blanche en plein ecran.
251h=figure;
252set(h,'color','w','units','normalized','position',[0 0 1 1]);
253   
254%%%%%%%%%%%%%%%%%%
255% Donnees de test
256%%%%%%%%%%%%%%%%%%
257
258% On trace le diagramme de dispersion tout en recuperant les informations
259% sur les coefficients de regression lineaire et de correlation.
260subplot(1,2,1)
261[coeffs, r2] = generalscatterplot(datatestEPSAT, datatestMSG, 'Cumuls EPSAT (mm)', 'intensites MSG');
262clear r2
263set(gca,'FontSize',15,'FontAngle','italic','FontName','Times New Roman');
264
265% Ajout de la formule de regression.
266formule = (['Regression : y = ' num2str(coeffs(1)) ' * x + ' num2str(coeffs(2))]);
267text(0.5,0.97,formule,...
268    'HorizontalAlignment','center','verticalAlignment','middle',...
269    'Units','Normalized','FontSize',13,'FontAngle','italic',...
270    'FontName','Times New Roman'); 
271
272%%%%%%%%%%%%%%%%%%
273
274
275%%%%%%%%%%%%%%%%%%%%%%%%
276% Donnees de validation
277%%%%%%%%%%%%%%%%%%%%%%%%
278
279% Passage des donnees d'intensites en donnees de precipitation par la
280% formule trouvee avec le test.
281datavalidMSG = coeffs(1) * datavalidMSG + coeffs(2);
282
283% On trace le diagramme de dispersion entre les donnees de precipitations
284% d'EPSAT et celles obtenues d'apres la formule reliant les intensites aux
285% precipitations.
286subplot(1,2,2)
287[coeffs,r2] = generalscatterplot(datavalidEPSAT, datavalidMSG, 'Cumuls EPSAT (mm)', 'cumuls par l''analyse des Tb MSG (mm)');
288clear coeffs
289clear r2
290set(gca,'FontSize',15,'FontAngle','italic','FontName','Times New Roman');
291
292% Ajout d'une ligne de reference (y=x).
293switch application
294  case {'matlab'}
295     lineref = refline(1,0);
296     set(lineref,'color','k','linewidth',2);
297  case {'octave'}
298     disp(['www : no refline available using ', application]);
299  otherwise
300     error('eee : unknown application running');
301end
302
303% Ajout d'un commentaire pour la legende.
304comm = ('Regression (rouge), Reference y=x (noir)');
305text(0.5,0.97,comm,...
306    'HorizontalAlignment','center','verticalAlignment','middle',...
307    'Units','Normalized','FontSize',13,'FontAngle','italic',...
308    'FontName','Times New Roman');
309
310%%%%%%%%%%%%%%%%%%%%%%%%
311
312% Ajout d'un titre general.
313Titlegen = (['Validation croisee de la relation precipitations-intensites sur une zone de ' num2str(lonmin) ' a ' num2str(lonmax) ' en longitudes et de ' num2str(latmin) ' a ' num2str(latmax) ' en latitudes (' num2str(pcrecover) ' pour cent de recouvrement)']);
314text(-0.2,-0.10,Titlegen,...
315    'HorizontalAlignment','center','verticalAlignment','middle',...
316    'Units','Normalized','FontSize',15,'FontAngle','italic',...
317    'FontName','Times New Roman'); 
318
319result=0;
320
321end
322
323%!demo
324%! clear all
325%! close all
326%! varamma_startup
327%! more off
328%! [ij_intensity_concat, time_intensity_concat, Longitudes, Latitudes] = intensityMSG_concat('extracted', 0, 0, 0, 0, 200, 200, 2006, 08, 01, 08, 31);
329%! [ij_cumul_concat, time_cumul_concat, Longitudes, Latitudes] = cumulEPSAT_concat('extracted', 0, 0, 0, 0, 200, 200, 2006, 08, 01, 08, 31);
330%! result=MSGanalysiscrossvalidation(ij_intensity_concat, ij_cumul_concat, time_intensity_concat, time_cumul_concat, Longitudes, Latitudes, -20, -10, 10, 20);
Note: See TracBrowser for help on using the repository browser.