IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Problème code MIDAS (MIxed DAta Sampling)


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème code MIDAS (MIxed DAta Sampling)
    Bonjour,

    Travaillant sur un Mixed Data Sampling sur Matlab afin d'étudier l'apport prédictif de variables financières sur le PIB. Mon code n'aboutit pas et m'affiche l'erreur suivante:

    "Index exceeds array bounds"

    J'ai vérifié tous mes paramètres et matrices, je ne parviens pas à à trouver l'erreur. Est ce que l'un d'entre vous qui maîtrise accepterait de jeter un coup d'oeil à mon code afin de m'éclairer?

    Un grand merci par avance.

    Mon code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    %--------------------------------------------------------------------------
    %% OBJET: Estimation d'un modèle MIDAS avec une fonction de poids almon exp
    %         Application à la croissance trimestrielle du PIB
    %--------------------------------------------------------------------------
    % DESCRIPTIF:  
    % Programme principal: 
    % 1) charge les données de haute et basse fréquences
    % 2) appelle l'algorithme d'estimation par MCNL
    % 3) affiche les résultats d'estimation
    % 4) représente les fonctions de poids
    % Fonction de poids almonf
    %--------------------------------------------------------------------------
     
     
    clear; clc; close all; 
     
    %% Paramètres à modifier
    r = 3;  % nb de variables explicatives mensuelles 
    K = 12;  % nb de retards du polynome Almon (retard midas)
    p_ar = 1; % nb de termes autorégressifs
    bounds = 1;  % si 1, on impose theta2<0 dans la fonction almon
    delai_m = 0;  % si >0, on ne connait pas la variable mensuelle sur les delai_m derniers mois du trimestre
    options = optimset('TolX',10^(-10),'TolFun',10^(-10),'MaxIter',1000,'MaxFunEvals',10^5,'Display','off');
    % Options de l'Optimisation
     
    % conditions initiales
    param_init = [1;-1;zeros(p_ar,1);1;0.5;-0.15] + randn(5+p_ar,1);
        % paramètres initiaux : c, delta, phi, beta_1 ... beta_r
        % theta1_1 ... theta1_r  theta2_1... theta2_r
     
     
    %% Chargement de la BDD
    file = 'DATA.xlsx';
    DATA_L = xlsread(file,1);   % endog = variable expliquée trimestrielle
    date_L = DATA_L(1:end,1); % les dates trimestrielles en format numérique
    endog_L = DATA_L(1:end,2);  % le PIB trimestriel
    indic_L = DATA_L(1:end,3);  % l'indicatrice du trimestre 2009T1
     
    DATA_H = xlsread(file,2);   % variables explicatives mensuelles
    date_H = DATA_H(1:end,1); % les dates mensuelles en format numérique
    exog = DATA_H(1:end,2:r+1); % variables explicatives mensuelles
     
    %Retraitement des données 
    oil = diff(log(exog(:,1)));
    stock = diff(log(exog(:,2)));
    spread = diff(exog(:,3));
    exog_H = [oil stock spread];
     
    %% Construction des variables expliquée et explicatives
    % Termes autorégressif
    X_ar = zeros(size(endog_L,1),p_ar);
    for i_p = 1:p_ar
        X_ar(:,i_p) = [repmat(mean(endog_L),i_p,1);endog_L(1:end-i_p)];
    end
     
    % Recherche des dates communes aux vecteurs H et L
    [date_com,index_L,index_H]=intersect(date_L,date_H);
        % date_com = dates communes des 2 vecteurs, 
        % index_L = indice des dates dans le vecteur trimestriel (en principe, 1,2,3...,T) 
        % index_H = indice des dates dans le vecteur mensuel
     
    % variable expliquée de fréquence trimestrielle
    Y = endog_L(index_L); 
     
    % variables explicatives de fréquence mensuelle
    x_midas_j = zeros(length(index_H),K);
    for j=1:length(index_H)
       x_midas_j(j,:)=(index_H(j)-delai_m:-1:index_H(j)-K+1-delai_m);
    end
     
    % Calcul du nb de valeurs manquantes à retirer
    if sum(sum(x_midas_j<=0))>0
        [a,b]=find(x_midas_j<=0);
        a = unique(a);  % lignes à supprimer car comportant indices <0
        x_midas_j(x_midas_j<=0)=1; 
    else
        a=0;
    end
     
    a = max([a;p_ar]); % termes autorégressifs
     
    X_midas = [];
    for i=1:r
        temp = exog_H(:,i);  
        X_midas = [X_midas temp(x_midas_j)];
    end
     
    % matrice des explicatives par bloc de K colonnes 
    % colonnes 1:K : retards de la var 1, K+1:2K : var 2 etc
     
    % on supprime les premiers points du fait des K retards
    Y = Y(max(a)+1:end,:);  
    X_midas = X_midas(max(a)+1:end,:);
    X_control = [indic_L(max(a)+1:end,:) X_ar(max(a)+1:end,:)];
     
    n_X_H = size(X_midas,2)/K;
    n_X_L = size(X_control,2);
     
    T = size(Y,1);
     
    %% Estimation du modèle
    [paramopt,res,code,tstat] = estim_midas(Y,X_midas,X_control,param_init,bounds,options);
     
     
    %% Tests de diagnostic
    [~,pval_JB] = jbtest(res);  % JB test
    [~,pval_LB] = lbqtest(res,'lags',[4,12,20]);  % Ljung Box test
    [~,pval_ARCH] = lbqtest(res.^2,'lags',[4,12,20]);  % McLeod-Li test
     
     
    %% Affichage des résultats d'estimation
    format compact
    disp('Résultats d''estimation');
    disp(['Exit condition: ' num2str(code)]);
    % >0: Function converged to a solution x
    %  0: The maximum number of function evaluations or iterations was exceeded
    % <0: The function did not converge to a solution
     
    disp(['R-squared: ' num2str(1-(res'*res)/sum((Y-mean(Y))'*(Y-mean(Y))))]);
    disp(['Jarque Bera test: ' num2str(pval_JB)]);
    disp(['Ljung Box test: ' num2str(pval_LB)]);
    disp(['ARCH effects test: ' num2str(pval_ARCH)]);
     
    nom_coef = ['cste  ';'I_09T1';'phi   ';'beta  ';'theta1';'theta2'];
    tab_resu = table(nom_coef,round(paramopt,3),round(tstat,3),'VariableNames',{'Coef','bet','tstat'});
    disp(tab_resu)
     
    % Affichage des poids
    theta= paramopt(end-1:end)';
    poids = poids_almon(theta,K);  % Kxr
    x = (0:11)';
    bar(x,poids); xlim([0 11]);
    Fichiers attachés Fichiers attachés

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonjour,

    L'erreur vient des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X_midas = [];
    for i=1:r
        temp = exog_H(:,i);
        X_midas = [X_midas temp(x_midas_j)];
    end
    x_midas_jest de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    x_midas_j =  [1     1     1     1     1     1     1     1     1     1     1     1
         4     3     2     1     1     1     1     1     1     1     1     1
         7     6     5     4     3     2     1     1     1     1     1     1
        10     9     8     7     6     5     4     3     2     1     1     1
        13    12    11    10     9     8     7     6     5     4     3     2
        16    15    14    13    12    11    10     9     8     7     6     5
     
    ...
     
       388   387   386   385   384   383   382   381   380   379   378   377
       391   390   389   388   387   386   385   384   383   382   381   380
       394   393   392   391   390   389   388   387   386   385   384   383
       397   396   395   394   393   392   391   390   389   388   387   386
       400   399   398   397   396   395   394   393   392   391   390   389
       403   402   401   400   399   398   397   396   395   394   393   392
       406   405   404   403   402   401   400   399   398   397   396   395]
    et son plus grand éléments vaut max(x_midas_j(:)) = 406.
    Or, temp n'a que 405 éléments, en prendre le 406[exp]ème[/exp] est imposible. Matlab renvoie donc une erreur lorsqu'il lui est demander de faire : temp(x_midas_j).
    C'est donc probablement la création de la variable x_midas_j qui pose problème.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Un grand merci pour ces éléments.

    Savez-vous comment je peux remédier à cela? Je vous avoue peu maîtriser le logiciel ainsi que le modèle économétrique...

    En vous souhaitant une bonne journée

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonjour,

    Pas vraiment : je peux aider en Matlab pour implémenter un modèle, mais pas pour le recréer.

Discussions similaires

  1. Probléme code C
    Par conceicao dans le forum C
    Réponses: 12
    Dernier message: 23/01/2007, 13h44
  2. Réponses: 6
    Dernier message: 23/12/2006, 12h46
  3. [VBA-E] Cherche codes équivalents à "Read, Data, Restore (Basic)"
    Par Brunox73 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/05/2006, 13h17
  4. [Problème code] Afficher/Masquer div
    Par glloq8 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/03/2006, 14h18
  5. [8086] Adresse du code segment et data segment ?
    Par sali dans le forum Assembleur
    Réponses: 1
    Dernier message: 14/05/2005, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo