\name{rq.fit.sfnc}
\alias{rq.fit.sfnc}
\title{Sparse Constrained Regression Quantile Fitting}
\description{
  Fit constrained regression quantiles using a sparse implementation of
  the Frisch-Newton Interior-point algorithm.
}
\usage{
rq.fit.sfnc(x, y, R, r, tau = 0.5,
            rhs = (1-tau)*c(t(x) \%*\% rep(1,length(y))),control)
}
\arguments{
  \item{x}{structure of the design matrix X stored in csr format}
  \item{y}{response vector}
  \item{R}{constraint matrix stored in csr format}
  \item{r}{right-hand-side of the constraint}
  \item{tau}{desired quantile}
  \item{rhs}{the right-hand-side of the dual problem; regular users
    shouldn't need to specify this.}
  \item{control}{control paramters for fitting see \code{sfn.control}}
}
\details{
  This is a sparse implementation of the Frisch-Newton algorithm for
  constrained quantile regression described in Koenker and Portnoy (1996).
  The sparse matrix linear algebra is implemented through the functions
  available in the R package \pkg{SparseM}.
}
\value{
  \item{coef}{Regression quantile coefficients}
  \item{ierr}{Error code for the internal Fortran routine \code{srqfn}:
    \describe{
      \item{1:}{ insufficient work space in call to \code{extract}}
      \item{3:}{ insufficient storage in iwork when calling ordmmd}
      \item{4:}{ insufficient storage in iwork when calling sfinit}
      \item{5:}{ nnzl > nnzlmax when calling sfinit}
      \item{6:}{ nsub > nsubmax when calling sfinit}
      \item{7:}{ insufficient work space in iwork when calling symfct}
      \item{8:}{ inconsistancy in input when calling symfct}
      \item{9:}{ tmpsiz > tmpmax when calling symfct; increase tmpmax}
      \item{10:}{ nonpositive diagonal encountered when calling blkfct}
      \item{11:}{ insufficient work storage in tmpvec when calling blkfct}
      \item{12:}{ insufficient work storage in iwork when calling blkfct}
      \item{13:}{ nnzd > nnzdmax in e,je when calling amub}
      \item{14:}{ nnzd > nnzdmax in g,jg when calling amub}
      \item{15:}{ nnzd > nnzdmax in h,jh when calling aplb}
      \item{15:}{ tiny diagonals replaced with Inf when calling blkfct}
    }
  }
  \item{it}{Iteration count}
  \item{time}{Amount of time used in the computation}
}
\references{
  Koenker, R and Ng, P. (2002).  SparseM:  A Sparse Matrix Package for \R; 
  \url{https://CRAN.R-project.org/package=SparseM}

  Koenker, R. and P. Ng(2005).
  Inequality Constrained Quantile Regression, \emph{Sankya}, 418-440.
}
\author{Pin Ng}
\seealso{
  \code{\link{rq.fit.sfn}} for the unconstrained version,
  \pkg{SparseM} for the underlying sparse matrix \R package.
}
\examples{
## An artificial example :
n <- 200
p <- 50
set.seed(17)
X <- rnorm(n*p)
X[abs(X) < 2.0] <- 0
X <- cbind(1,matrix(X,n,p))
y <- 0.5 * apply(X,1,sum) + rnorm(n) ## true beta = (0.5, 0.5, ...)
R <- rbind(diag(p+1), -diag(p+1))
r <- c(rep( 0, p+1), rep(-1, p+1))

sX <- as.matrix.csr(X)
sR <- as.matrix.csr(R)
try(rq.o <- rq.fit.sfnc(sX, y, sR, r)) #-> not enough tmp memory

(tmpmax <- floor(1e5 + exp(-12.1)*(sX@ia[p+1]-1)^2.35))
## now ok:
rq.o <- rq.fit.sfnc(sX, y, sR, r, control = list(tmpmax = tmpmax))
}
\keyword{regression}
