fminsearch-правдоподобная оценка для сеточной функции - PullRequest
0 голосов
/ 21 февраля 2012

Я хочу создать многопараметрическую (здесь четыре) функцию с сеткой, а затем интерполировать ее для любых X, Y. Предполагая, что это моя функция плотности вероятности, я вычисляю их маргинал по X. Я использую эту функцию для построения набора данных. Каждый из моих M-файлов работает хорошо, по крайней мере, я так думаю. Но я получаю сообщение об ошибке, когда я запускаю часть оценки. Не могли бы вы помочь мне, если моя ошибка исправима.

    clear all;
    %%%Some parameters
    m1=0.01;
    m2=0.02;
    m3=0.001;
    Z=zeros(10,20,10,5);
    % MFILE1
    %Create a four variable function 
    % function w=anemon(m1,m2,m3,X,Y,k,l)
    % w=(m1*k+(m1+m2).*l)+X.*exp(-m3.*Y);
    % end

    % MFILE2
    %Interpolate any (Xstar,Ystar) with a nonsence interpolation code
    %I wrote it only for giving an example
    % function p=interpanemon(Xstar,Ystar,m1,m2,m3,Z,X,Y,kk,ll)
    % p=0;
    % for i=1:length(X)-1
    %     for j=1:length(Y)-1
    %           if ((Y(j)<=Ystar)&&(Ystar<=Y(j+1)))&&((X(i)<=Xstar)&&(Xstar<=X(i+1)))
    %           p=(Z(i,j,kk,ll)+Z(i+1,j,kk,ll)+Z(i,j+1,kk,ll)+Z(i+1,j+1,kk,ll))/4;
    %          end
    %     end
    % end
    %     return
    %  end

    % MFILE3
    %Create a model which I'm going to use for parameter estimation
    % function loglik= modelanemon(p)
    % global n x m2 m3 kk ll ;
    % f =marjinteranemon(Ystar,p,m2,m3,Z,X,Y,kk,ll); 
    % loglik0=(-1)*(x.*log(f)+(n-x).*log(1-f));%minus likelihood
    % loglik=sum(loglik0);
    % end

%%
    X=linspace(0,10,6);
    Y=linspace(0,20,6);
    for k=1:10
        kk=k-1;
        for l=1:5
            ll=l-1;
    for i=1:length(X)
        for j=1:length(Y)
            Z(i,j,k,l)=anemon(m1,m2,m3,X(i),Y(j),kk,ll);
        end
    end
        end
    end
    %%%Now run all M-Files for self control
    anemon(m1,m2,m3,X,Y,4,5)
    interpanemon(3,4,m1,m2,m3,Z,X,Y,4,5)
    marjinteranemon(3,Z,X,Y,m1,m2,m3,4,5)

%STARTING PROBLEM PART


%SCRIPT fminsearch, I will be greatful if you have any advise. This part of        %       code  doesn't work
    % global n Ystar x kk ll m1 m2 m3;
    % m1=0.1;
    % m2=0.2;
    % m3=0.3;
    % Ystar=[1 3 6 9 12 18]';
    % kk=[1 1 2 3 3 4]';
    % ll=[0 0 1 3 4 5]';
    % y=marjinteranemon(Ystar,Z,X,Y,m1,m2,m3,kk,ll);
    % n=100;
    % x=y.*n;
    % pstart=5;
    % [p1,modelvalue]=fminsearch(@modelanemon,pstart);

1 Ответ

1 голос
/ 21 февраля 2012
  1. Из функции anemon значение mu должно быть m3.
  2. Поскольку вы пытаетесь оценить параметр m1, вам необходимо передать все остальные данные в функцию modelanemonкак параметры или глобальные переменные.

Обычно я бы не рекомендовал глобальные переменные, но я думаю, что это может быть слишком сложным, чтобы попытаться передать параметры в дескрипторы локальной функции.:-) Твой код будет примерно таким:

    % MFILE3
    %Create a model which I'm going to use for parameter estimation
    function loglik= modelanemon(p)
      global Ystar m2 m3 Z X Y kk ll n x;
      f =marjinteranemon(Ystar,p,m2,m3,Z,X,Y,kk,ll); 
      loglik0=(-1)*(x.*log(f)+(n-x).*log(1-f));%minus likelihood
      loglik=sum(loglik0);
    end
...