【问题标题】:Coding a log-likelihood function in MATLAB在 MATLAB 中编写对数似然函数
【发布时间】:2019-06-14 14:38:25
【问题描述】:

我正在关注来自 Quantitative Finance 的非常详细的post,但是,我的问题是编码问题。

我正在尝试估计 GARCH(1,1) 模型(不使用统计工具箱,而是使用长手方法,原因是我真的很想了解模型的来龙去脉)。

我已经发布了一张我需要完成的步骤的图片,

我不知道如何在 MATLAB 中编写这种对数似然。我基本上需要在迭代中最大化对数相似性:

我的尝试:

custlogpdf = @(u1,sigma) -1/2*sum( log(2*pi) + log(sigma^2) + (u1^2)./sigma^2 );
phat = mle(u1,'nloglf', custlogpdf, 'start' 0.05)

谁能指出我使用函数的最大似然估计的正确方向?

我从尝试中得到的错误:

    Error in test (line 40)
phat = mle(u1,'nloglf', custlogpdf, 'start', 0.05)

Caused by:
    Error using test>@(u1,sigma)-1/2*sum(log(2*pi)+log(sigma^2)+((u1)^2)/sigma^2)
    Too many input arguments.

【问题讨论】:

  • 请解释一下您的尝试不起作用的原因(错误的结果?错误?...)。
  • 错误:文件:test.m 行:39 列:16 表达式无效。调用函数或索引变量时,请使用括号。否则,检查不匹配的分隔符。
  • 最好edit您的帖子并添加完整的错误消息,与控制台中显示的完全相同(这样我们也可以看到它指的是哪个表达式到)。无论如何,这个错误听起来像是缺少() 的简单错字(即甚至不是“运行时”错误,而是“编译”错误)。您是否正在为您的代码文件使用 MATLAB 编辑器?如果是 - 它不是在有问题的表达式/行下显示一条红线吗?如果您使用的是其他文本编辑器,请尝试在您的脚本上运行 checkcode
  • 谢谢,我已经完全按照它的出现添加了错误,它有很多输入参数@Dev-iL
  • 请@Dev-iL 任何帮助或想法?

标签: matlab quantitative-finance probability-density mle log-likelihood


【解决方案1】:

documentation of mle 声明:

此自定义函数接受以下输入参数:paramsdatacensfreq

nloglf 必须接受所有四个参数,即使您不使用 'Censoring''Frequency' 名称-值对组参数。在这种情况下,您可以编写 'nloglf' 以忽略 censfreq 参数。

nloglf 返回一个标量负对数似然值和可选的负对数似然梯度向量(参见'Options' 中的'GradObj' 字段)。

...但是您的函数句柄只接受 2 个输入 => MATLAB 试图将 4 个输入传递给一个只接受 2 个的函数 => Error: Too many input arguments.

你应该做的是定义一个正确的function,它有4个输入和1或2个输出,然后在调用mle时使用@funcName引用它,即:

function test
...
initialGuess = [valForParam1, valForParamN];
phat = mle(u1, 'nloglf', custlogpdf, 'start', initialGuess );
...

% function [likelihood, likeGrad] = custlogpdf(params, data, cens, freq)
function [likelihood, likeGrad] = custlogpdf(params, data, ~, ~)
likelihood = ... % some function of params + data
if nargout == 2
  likeGrad = ... % some other function of the inputs
end

【讨论】:

  • 我可以保持我的功能不变,然后像这样在第 40 行添加一些东西吗? phat = mle(u1,'nloglf', custlogpdf, 'start', 0.05, 'cens', nloglf, 'freq' nloglg)
  • 这绝对不是我说的。问题在于你如何定义函数custlogpdf,而不是你如何调用mle。在匿名函数形式中,它应该类似于 custlogpdf = @(params, data, cens, freq) ...,因为这可能需要多行来定义 - 我建议使用“命名”函数而不是匿名函数。
  • 您建议使用哪个命名函数,对不起,我真的不明白,顺便感谢您的帮助
  • 函数 newpdf = lognormpdf(data,sigma) newpdf = -1/2*sum(log(2*pi)+log(sigma^2)+((u1)^2)/sigma^ 2); phat = mle(u1,'logpdf', newpdf, 'start', 0.05);结束
  • 你的意思是这个吗
猜你喜欢
  • 2014-01-14
  • 2016-04-14
  • 1970-01-01
  • 2018-06-18
  • 2016-10-13
  • 2019-09-13
  • 1970-01-01
  • 2020-09-10
  • 2020-02-29
相关资源
最近更新 更多