Кодирование логарифмической функции в MATLAB - PullRequest
0 голосов
/ 21 января 2019

Я следую за очень подробным постом от Quantitative Finance, однако моя проблема - проблема кодирования.

Я пытаюсь оценить модель GARCH (1,1) (не используя статистический инструментарий и скорее метод длинной руки, причина этого в том, что я действительно хочу понять входы и выходы модели).

Я разместил фотографию шагов, которые мне нужно выполнить для простоты,

From linked post

Я застрял на том, как я могу написать это логарифмическое правдоподобие в MATLAB. По сути, мне нужно максимально увеличить логарифмическое сходство за итерации:

enter image description here

Моя попытка:

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.

1 Ответ

0 голосов
/ 21 января 2019

Документация mle гласит:

Эта пользовательская функция принимает следующие входные аргументы: params, data, cens, freq.

nloglf должен принимать все четыре аргумента , даже если вы не используете 'Censoring' или 'Frequency' аргументы пары имя-значение. Вы можете написать 'nloglf', чтобы игнорировать cens и freq аргументы в этом случае.

nloglf возвращает скалярное отрицательное значение логарифмического правдоподобия и, необязательно, вектор отрицательного градиента логарифмического правдоподобия (см. Поле 'GradObj' в 'Options').

... но ваш дескриптор функции принимает только 2 входа => MATLAB пытается передать 4 входа в функцию, которая принимает только 2 => Error: Too many input arguments..

Что вам, вероятно, следует сделать, это определить правильный function, который имеет 4 входа и 1 или 2 выхода, а затем обратиться к нему с помощью @funcName при вызове mle, то есть ::

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...