Квантильная регрессия с помощью linprog в Matlab
Я пытаюсь реализовать процесс квантильной регрессии с простой настройкой в Matlab. Эта страница содержит описание квантильной регрессии в виде линейной программы и отображает соответствующие матрицы и векторы. Я пытался реализовать это в Matlab, но я не получаю правильный последний элемент вектора bhat. Это должно быть около 1, но я получаю очень низкое значение (<1e-10). Используя другой алгоритм, который я имею, я получаю значение 1.0675. Где я неправ? Я предполагаю, что A, B или F не правы.
Я пытался играть с optimset, но я не думаю, что это проблема. Я думаю, что я сделал ошибку преобразования при переходе от математики к коду, я просто не вижу, где.
% set seed
rng(1);
% set parameters
n=30;
tau=0.5;
% create regressor and regressand
x=rand(n,1);
y=x+rand(n,1)/10;
% number of regressors (1)
m=size(x,2);
% vektors and matrices for linprog
f=[tau*ones(n,1);(1-tau)*ones(n,1);zeros(m,1)];
A=[eye(n),-eye(n),x;
-eye(n),eye(n),-x;
-eye(n),zeros(n),zeros(n,m);
zeros(n),-eye(n),zeros(n,m)];
b=[y;
y
zeros(n,1);
zeros(n,1)];
% get solution bhat=[u,v,beta] and exitflag (1=succes)
[bhat,~,exflag]=linprog(f',A,b);
1 ответ
Я решил свою проблему, используя формулировку (в pdf) выше той, которую я пытался реализовать в вопросе. Я поместил это в функцию Matlab, если вы заинтересованы в коде.
function [ bhat ] = qregressMatlab( y, x, tau )
% bhat are the estimates
% y is a vector of outcomes
% x is a matrix with columns of explanatory variables
% tau is a scalar for choosing the conditional quantile to be estimated
n=size(x,1);
m=size(x,2);
% vectors and matrices for linprog
f=[tau*ones(n,1);(1-tau)*ones(n,1);zeros(m,1)];
Aeq=[eye(n),-eye(n),x];
beq=y;
lb=[zeros(n,1);zeros(n,1);-inf*ones(m,1)];
ub=inf*ones(m+2*n,1);
% Solve the linear programme
[bhat,~,~]=linprog(f,[],[],Aeq,beq,lb,ub);
% Pick out betas from (u,v,beta)-vector.
bhat=bhat(end-m+1:end);
end