2

我正在尝试通过 Matlab 中的简单设置来实现分位数回归过程。此页面包含对作为线性程序的分位数回归的描述,并显示了适当的矩阵和向量。我试图在 Matlab 中实现它,但我没有得到正确的bhat向量的最后一个元素。它应该在 1 左右,但我得到的值非常低(<1e-10)。使用我拥有的另一种算法,我得到的值为 1.0675。我哪里做错了?我猜Ab或者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);
4

1 回答 1

0

我通过使用我试图在问题中实施的公式(在 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
于 2014-02-17T11:06:39.107 回答