Ale*_*ica 7 matlab log-likelihood
背景:我正在研究一个类似于链接 [1] 中描述的非线性逻辑回归的问题(我的问题更复杂,但链接 [1] 足以用于本文的下一部分)。将我的结果与与 R 包并行获得的结果进行比较,我得到了相似的系数结果,但(非常近似)相反的对数似然。
假设: matlab中fitnlm给出的logLikelihood实际上是负LogLikelihood。(请注意,这会损害 Matlab 的 BIC 和 AIC 计算)
推理:在[1]中,通过两种不同的方法解决了同一个问题。ML-approach/ 通过定义负 LogLikelihood 并使用 fminsearch 进行优化。GLS-方法/通过使用 fitnlm。
ML 方法后的负对数似然为:380
GLS 方法后的负对数似然为:-406
我想第二个应该至少乘以(-1)?
问题:我错过了什么吗?(-1) 系数是否足够,或者这个简单的修正还不够?
自包含代码:
%copy-pasting code from [1]
myf = @(beta,x) beta(1)*x./(beta(2) + x);
mymodelfun = @(beta,x) 1./(1 + exp(-myf(beta,x)));
rng(300,'twister');
x = linspace(-1,1,200)';
beta = [10;2];
beta0=[3;3];
mu = mymodelfun(beta,x);
n = 50;
z = binornd(n,mu);
y = z./n;
%ML Approach
mynegloglik = @(beta) -sum(log(binopdf(z,n,mymodelfun(beta,x))));
opts = optimset('fminsearch');
opts.MaxFunEvals = Inf;
opts.MaxIter = 10000;
betaHatML = fminsearch(mynegloglik,beta0,opts)
neglogLH_MLApproach = mynegloglik(betaHatML);
%GLS Approach
wfun = @(xx) n./(xx.*(1-xx));
nlm = fitnlm(x,y,mymodelfun,beta0,'Weights',wfun)
neglogLH_GLSApproach = - nlm.LogLikelihood;
Run Code Online (Sandbox Code Playgroud)
来源:
[1] https://uk.mathworks.com/help/stats/examples/nonlinear-logistic-regression.html
基本上,fitnlm.m 是对 NonLinearModel.fit 的调用。
打开 NonLinearModel.m 时,会出现第 1209 行:
model.LogLikelihood = getlogLikelihood(model);
Run Code Online (Sandbox Code Playgroud)
getlogLikelihood 本身在第 1234-1251 行之间进行了描述。
例如:
function L = getlogLikelihood(model)
(...)
L = -(model.DFE + model.NumObservations*log(2*pi) + (...) )/2;
(...)
Run Code Online (Sandbox Code Playgroud)
另请注意,这会显着影响 ModelCriterion.AIC 和 ModelCriterion.BIC,因为它们是使用 model.LogLikelihood 计算的(“认为”它是 logLikelihood)。
要获取 BIC/AIC/... 的相应公式,请输入:
edit classreg.regr.modelutils.modelcriterion
Run Code Online (Sandbox Code Playgroud)