【问题标题】:Using MLE function to estimate the parameters of a custom distribution使用 MLE 函数估计自定义分布的参数
【发布时间】:2019-10-24 15:33:33
【问题描述】:

我正在尝试在 MATLAB 中使用 mle() 函数来估计 6 参数自定义分布的参数。

自定义分发的PDF

CDF

其中Γ(x,y)和Γ(x)是上不完全伽马函数伽马函数,分别。 αθβabc 是自定义分布的参数。 K

给出

给定一个数据向量'data',我想估计参数αθβ,a,b,和 c.

所以,到目前为止我已经想出了这个代码:

data        =  rand(20000,1); % Since I cannot upload the acutal data, we may use this
t           =  0:0.0001:0.5;    
fun         =  @(w,a,b,c) w^(a-1)*(1-w)^(b-1)*exp^(-c*w);

% to estimate the parameters
custpdf     =  @(data,myalpha,mybeta,mytheta,a,b,c)...
                ((integral(@(t)fun(t,a,b,c),0,1)^-1)*...
                mybeta*...
                igamma(myalpha,((mytheta/t)^mybeta)^(a-1))*...
                (mytheta/t)^(myalpha*mybeta+1)*...
                exp(-(mytheta/t)^mybeta-(c*(igamma(myalpha,(mytheta/t)^mybeta)/gamma(myalpha)))))...
                /...
                (mytheta*...
                gamma(myalpha)^(a+b-1)*...
                (gamma(myalpha)-igamma(myalpha,(mytheta/t)^mybeta))^(1-b));

custcdf     =  @(data,myalpha,mybeta,mytheta,a,b,c)...
                (integral(@(t)fun(t,a,b,c),0,1)^-1)*...
                integral(@(t)fun(t,a,b,c),0,igamma(myalpha,(mytheta/t)^mybeta)^mybeta/gamma(myalpha));

phat        =  mle(data,'pdf',custpdf,'cdf',custcdf,'start',0.0);

但我收到以下错误:

Error using mlecustom (line 166)
Error evaluating the user-supplied pdf function
'@(data,myalpha,mybeta,mytheta,a,b,c)((integral(@(t)fun(t,a,b,c),0,1)^-1)*mybeta*igamma(myalpha,((mytheta/t)^mybeta)^(a-1))*(mytheta/t)^(myalpha*mybeta+1)*exp(-(mytheta/t)^mybeta-(c*(igamma(myalpha,(mytheta/t)^mybeta)/gamma(myalpha)))))/(mytheta*gamma(myalpha)^(a+b-1)*(gamma(myalpha)-igamma(myalpha,(mytheta/t)^mybeta))^(1-b))'.

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

Caused by:
    Not enough input arguments.

我试图查看错误行,但无法确定错误的实际位置。

哪个函数缺少更少的输入?是指fun吗?为什么mle 在尝试估计参数时会缺少更少的输入?

有人可以帮我调试错误吗?

提前致谢。

【问题讨论】:

  • 请将错误粘贴为代码(而不是图像),以便可以搜索。另外,标题中不需要matlab
  • @Dev-iL 我按要求进行了更改。
  • 我很确定问题在于使用您的custpdf 作为pdfmle,因为mle 仅提供2 个输入(请参阅docs)-“此自定义函数接受向量data 和一个或多个单独的分布参数作为输入参数,并返回一个累积概率值向量。"。如果您想将超过 2 个变量传递给您的函数,您应该执行类似what's shown here 的操作。 custcdf 也是如此。
  • @Dev-iL 你的意思是说mle(data,'pdf',custpdf,'cdf',custcdf,'start',0.0);应该是mle(data,'pdf',@data custpdf(data,myalpha,mybeta,mytheta,a,b,c),'cdf',@data custcdf(data,myalpha,mybeta,mytheta,a,b,c),'start',0.0);
  • 大概是的(但有 2 个输入和正确的语法)。无论如何 - 至少在调试阶段,我建议使用更少的匿名函数和更多的函数句柄来命名函数(例如function out = custpdf(...))。调试多行匿名函数并不十分方便。

标签: matlab debugging distribution mle


【解决方案1】:
  • exp() 是一个函数,不是变量,精确的参数
exp^(-c*w) ---> exp(-c*w)
  • 起点关注6 parameters,不止一个 0.1*ones(1,6)
  • 在 custcdf mle 中要求积分的上限为 标量,我做了一些试验和错误,范围是 [2~9]。为了 试验一些值会导致负 cdf 或小于 1 丢弃它们。
  • 然后使用正确的计算上限,看看它是否是 与您预定义的相同。

我重写了所有函数,检查一下

代码如下

Censored = ones(5,1);% All data could be trusted 

data        =  rand(5,1); % Since I cannot upload the acutal data, we may use this

f         =  @(w,a,b,c) (w.^(a-1)).*((1-w).^(b-1)).*exp(-c.*w);
% to estimate the parameters
custpdf     =  @(t,alpha,theta,beta, a,b,c)...
                (((integral(@(w)f(w,a,b,c), 0,1)).^-1).*...
                beta.*...
                ((igamma(alpha, (theta./t).^beta)).^(a-1)).*...
                ((theta./t).^(alpha.*beta + 1 )).*...
                exp(-(((theta./t).^beta)+...
                c.*igamma(alpha, (theta./t).^beta)./gamma(alpha))))./...
                (theta.*...
                ((gamma(alpha)).^(a+b-1)).*...
                 ((gamma(alpha)-...
                 igamma(alpha, (theta./t).^beta)).^(1-b)));


custcdf = @(t,alpha,theta,beta, a,b,c)...
         ((integral(@(w)f(w,a,b,c), 0,1)).^-1).*...         
     (integral(@(w)f(w,a,b,c), 0,2));



phat = mle(data,'pdf',custpdf,'cdf',custcdf,'start', 0.1.*ones(1,6),'Censoring',Censored);

结果

    phat = 0.1017    0.1223    0.1153    0.1493   -0.0377    0.0902

【讨论】:

  • 非常感谢。您的代码运行良好。请问是否有办法仍然使用上限igamma(myalpha,(mytheta/t)^mybeta)^mybeta/gamma(myalpha)。会使用for loop 帮助吗?尽管传递数据向量似乎存在问题。还有一件事,我们可以使用phat 值来生成自定义分布的pdf吗?这可以让我们验证phat 是否正确获得。 (我可能会将其作为一个单独的问题发布)
  • custpdf(data, pheta(1), pheta(2), pheta(3), pheta(4), pheta(5), pheta(6)) 可用于生成 pdf。上限需要是标量,正如你所说,你可以绘制 pdf 看看它是否是正确的。使用 upper bound = 2, 3.....9 并绘制 pdf,因为您的真实数据可能会有所不同。如果您遇到诸如 cdf 为负之类的错误,请尝试不同的上限,那么这是错误的猜测。或者错误可能是 cdf 必须大于或等于 1。
  • 我尝试使用 custpdf(data, pheta(1), pheta(2), pheta(3), pheta(4), pheta(5), pheta(6)),但我得到的 PDF 非常不同,但情况并非如此。也尝试了积分的不同upper bound,但没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多