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 :

Maximum de vraissemblance


Sujet :

MATLAB

  1. #1
    Invité
    Invité(e)
    Par défaut Maximum de vraissemblance
    Bonjour,
    N'ayant pas Eviews (et êtant plus à l'aise avec Matlab) j'aimerai éffectuer une MLE comme en bas de la page 22 de ce document:

    http://www.repad.org/ca/qc/uq/uqo/ds...otRTheoret.pdf


    Je ne connais pas l'équivalent sur Matlab.


    Merci pour l'aide.

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Il suffit de créer une fonction L(data,pars) qui renvoie la log-vraisemblance pour une jeu de données data et un vecteur de paramètres pars. Ensuite, on définit la fonction partielle l= @(pars) L(data,pars), à data fixé. Finalement, on envoie cette fonction à un des optimiseurs Matlab (doc fminunc, doc fmincon).

    Par contre, vu que tu as un modèle très simple (linéaire et gaussien), on devrait être capable de calculer explicitement la solution sans passer par une optimisation numérique. En gros c'est une régression!

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse par contre je ne vois pas très bien comment faire.

    Déjà comment faire sous Matlab un d(data) : variation journalière. Je suis obligé de faire une boucle? Ou un truc du genre data(2:end)-data(1:end-1)?
    Ceci me permettra de connaitre l'équivalent de data(-1) de Eviews.


    Donc j'ai ma fonction de vraisemblance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function y = fun(data, param) 
        res1=d(data)-param(1)-param(2)*data(-1);
        var=(param(3)^2)*data(-1)^(2*param(4));
        y=log(dnorm(res1/sqrt(var)))-log(var/2);
    end
    Et si je veux déterminer mes paramètres, en utilisant une otpimisation de type Marquardt (histoire de chalenger les résultats obtenus via Eviews) je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = fsolve(@fun,param,optimset('Display','iter','TolFun',1e-5,'MaxFunEvals',10000,'MaxIter',...
        10000,'Algorithm',{'levenberg-marquardt',.005}, 'TolX',1e-5, 'TolFun',1e-5));
    Merci pour votre aide.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Voici une autre méthode utilisant la fonction mle (mais on n'a pas le choix de l'optimisation):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for j=1:length(cibleName)
        cibleIndex = get_Index(cibleName{j},header)
        tmpCible = intersect(find(~isnan(Evol.Continu(:,cibleIndex))),find(~isinf(Evol.Continu(:,cibleIndex))));
        data = Evol.Continu(tmpCible,cibleIndex);
        a = mle(data,'pdf',@fun,'start',[1 1 1 1])
    end
    Avec ma fonction fun définie comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function y = fun(data,alfa,beta,sigma,gamma) 
        res = NaN(size(data,1),1);
        var = NaN(size(data,1),1);
     
        res(2:end) = data(2:end)-data(1:end-1)-alfa-beta*data(1:end-1);
        var(2:end) = (sigma.^2)*data(1:end-1).^(2*gamma);
     
        y=log(normpdf(res/sqrt(var)))-log(var/2);
    end
    Par contre ça ne fonctionne toujours pas dû à:

    Error using mlecustom (line 166)
    Error evaluating the user-supplied pdf function 'fun'.

    Error in mle (line 226)
    phat = mlecustom(data,varargin{:});

    Caused by:
    Error using -
    Matrix dimensions must agree.

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Déjà comment faire sous Matlab un d(data) : variation journalière. Je suis obligé de faire une boucle?
    Tu peux éviter la boucle avec la fonction diff()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Caused by: Error using -  Matrix dimensions must agree.
    Il faut surement que tu debug ta fonction avant de l'optimiser.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse. J'ai corrigé la définition de mon équation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function y = fun(data,alfa,beta,sigma,gamma) 
        res = NaN(size(data,1),1);
        var = NaN(size(data,1),1);
     
        res(2:end) = diff(data)-alfa-beta*data(1:end-1);
        var(2:end) = (sigma.^2)*data(1:end-1).^(2*gamma);
     
        y=log(normpdf(res./sqrt(var)))-log(var/2);
        y(1)=y(2);
    end
    Par contre quand j'utilise cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = mle(data,'pdf',@fun,'start',[1 1 1 1])
    J'obtiens ce message d'erreur:

    Error using mlecustom>llf_pdfcdf (line 439)
    The PDF function returned negative or zero values.

    Error in fminsearch (line 191)
    fv(:,1) = funfcn(x,varargin{:});

    Error in mlecustom (line 183)
    [phat,nll,err,output] = ...

    Error in mle (line 226)
    phat = mlecustom(data,varargin{:});
    J'ai une fonction qui est toujours négative. Mathématiquement cela ne devrait pas poser de problème pour ma MLE.

    Et quand j'utilise cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = fsolve(@fun,data,[1 1 1 1],optimset('Display','iter','TolFun',1e-5,'MaxFunEvals',10000,'MaxIter',...
        10000,'Algorithm',{'levenberg-marquardt',.005}, 'TolX',1e-5, 'TolFun',1e-5));
    J'obtiens ce message d'erreur:

    Undefined function 'minus' for input arguments of type 'struct'.

    Error in fun (line 5)
    res(2:end) = diff(data)-alfa-beta*data(1:end-1);

    Error in fsolve (line 241)
    fuser = feval(funfcn{3},x,varargin{:});

    Error in calibrationTaux (line 28)
    a = fsolve(@fun,data,[1 1 1
    1],optimset('Display','iter','TolFun',1e-5,'MaxFunEvals',10000,'MaxIter',...

    Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot
    continue.

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Mathématiquement cela ne devrait pas poser de problème pour ma MLE.
    Si car tu es censé passer une pdf à la mle(), et une pdf est toujours >=0

    Undefined function 'minus' for input arguments of type 'struct'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res(2:end) = diff(data)-alfa-beta*data(1:end-1); %l.5
    Pourquoi l'un des arguments data ou alfa est-il une structure ? Vérifie avec le debugger.

    Essayes optimset('Algorithm','interior-point'})

Discussions similaires

  1. [ ORACLE ][ STRUTS ] [ JAVA ] maximum open cursor
    Par LoulouFifi dans le forum Struts 1
    Réponses: 21
    Dernier message: 30/03/2011, 11h52
  2. Oracle ORA-00020 : maximum de processus
    Par Lisou dans le forum Administration
    Réponses: 5
    Dernier message: 22/03/2004, 16h27
  3. Taille maximum de tableau en Delphi
    Par yannick37 dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2004, 13h18
  4. récupération du maximum
    Par delicatessen2 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 15/09/2003, 14h10
  5. [Tableau] taille maximum
    Par vasilov dans le forum C
    Réponses: 15
    Dernier message: 01/08/2003, 10h52

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