# R/LarsPath.R In MPAlars: lars algorithm

###################################################################################
#' Constructor of LarsPath class
#'
#' This class stores the results of lars and fusion algorithms.
#'
#' \describe{
#'   \item{nbStep}{Number of steps of the algorithm.}
#'   \item{variable}{List of vector of size "step+1". The i+1-th item contains the index of non-zero coefficients at the i-th step.}
#'   \item{coefficient}{List of vector of size "step+1". The i+1-th item contains the non-zero coefficients at the i-th step.}
#'   \item{lambda}{Vector of length "step+1", containing the L1-norm of the coefficients at each step.}
#'   \item{dropIndex}{Vector of length "step" containing the index of the dropped variable at the i-th step, 0 means no variable has been dropped at this step.}
#'   \item{addIndex}{Vector of length "step" containing the index of the added variable at the i-th step, 0 means no variable has been added at this step.}
#'	 \item{mu}{Intercept.}
#'	 \item{ignored}{A vector containing index of ignored variables during the algorithm.}
#'   \item{p}{Total number of covariates.}
#'	 \item{fusion}{If TRUE,  results from MPA.fusion function.}
#' }
#'
#'
#' @name LarsPath-class
#' @rdname LarsPath-class
#' @exportClass LarsPath
#'
setClass(
Class="LarsPath",
representation=representation(
variable="list",
coefficient="list",
lambda="numeric",
dropIndex="numeric",
nbStep="numeric",
mu="numeric",
ignored="numeric",
fusion="logical",
p="numeric"
),
prototype=prototype(
variable=list(),
coefficient=list(),
lambda=numeric(0),
dropIndex=numeric(0),
nbStep=numeric(0),
mu=numeric(0),
ignored=numeric(0),
fusion=FALSE,
p=numeric(0)
)
)

###################################################################################
#'
#'  plot the path of the lars algorithm.
#'
#' \describe{
#'   \item{x}{LarsPath object.}
#'   \item{sep.line}{If TRUE, print vertical dashed line when a variable is added or dropped in the path.}
#'   \item{...}{Other plot arguments.}
#' }
#'
#' @title plot methods for LarsPath object
#' @docType methods
#' @rdname plot-methods
#' @name plot-methods
#' @aliases plot,LarsPath-method plot-methods
#'
#' @export
setMethod(
f="plot",
signature="LarsPath",
definition=function(x,sep.line=TRUE,...)
{
miny=0
maxy=0
for(i in 2:length(x@coefficient))
{
miny=min(miny,x@coefficient[[i]])
maxy=max(maxy,x@coefficient[[i]])
}
var=unique(unlist(x@variable))
plot(NA,xlim=c(min(x@lambda),max(x@lambda)),ylim=c(miny,maxy),main="Path",xlab="lambda",ylab="coefficients")
abline(h=0)
lines(x@lambda[1:2],c(0,x@coefficient[[2]][1]),col=which(var==x@variable[[2]][1]))

for(i in 2:(length(x@lambda)-1))
{
if(sep.line)
abline(v=x@lambda[i],col="blue",lty=2)

{
for(j in 1:length(x@coefficient[[i]]))
lines(x@lambda[i:(i+1)],c(x@coefficient[[i]][j],x@coefficient[[i+1]][j]),col=which(var==x@variable[[i]][j]))

lines(x@lambda[i:(i+1)],c(0,x@coefficient[[i+1]][j+1]),col=which(var==x@variable[[i+1]][j+1]))
}
else
{
j=1

while(x@variable[[i]][j]!=x@dropIndex[i])
{
lines(x@lambda[i:(i+1)],c(x@coefficient[[i]][j],x@coefficient[[i+1]][j]),col=which(var==x@variable[[i]][j]))
j=j+1
}
lines(x@lambda[i:(i+1)],c(x@coefficient[[i]][j],0),col=which(var==x@variable[[i]][j]))
j=j+1
while(j<=length(x@coefficient[[i]]))
{
lines(x@lambda[i:(i+1)],c(x@coefficient[[i]][j],x@coefficient[[i+1]][j-1]),col=which(var==x@variable[[i]][j]))
j=j+1
}
lines(x@lambda[i:(i+1)],c(0,x@coefficient[[i+1]][length(x@coefficient[[i]])]),col=which(var==x@variable[[i+1]][length(x@coefficient[[i]])]))
}
}

if(sep.line)
abline(v=x@lambda[length(x@lambda)],col="blue",lty=2)
axis(4, at=x@coefficient[[length(x@coefficient)]],labels=x@variable[[length(x@variable)]])
}
)

#' Plot of the coefficients of a step
#'
#' @title Plot of coefficients
#' @param x A LarsPath object.
#' @param step The step at which you want to plot the coefficients.
#' @param ylab Name of the y axis.
#' @param xlab Name of the x axis.
#' @param ... Other plot arguments.
#' @examples
#' dataset=MPA.simul(50,10000,0.4,10,50,matrix(c(0.1,0.8,0.02,0.02),nrow=2))
#' result=MPA.fusion(dataset$data,dataset$response)
#' plot.coefficient(result,45) #plot coefficients at the step 45
#' @export
#'
plot.coefficient=function(x,step,ylab="coefficients",xlab="variables",...)
{
if(missing(x))
stop("x is missing.")
if(missing(step))
stop("step is missing.")
if(class(x)!="LarsPath")
stop("x must be a LarsPath object")
if(!.is.wholenumber(step))
stop("step must be a positive integer smaller than [email protected]")
if( (step<0) || (step>x@nbStep) )
stop("step must be a positive integer smaller than [email protected]")

if(x@fusion)
{
index=sort(x@variable[[step+1]],index.return=TRUE)$ix if(x@variable[[step+1]][index[1]]!=1) { plot(c(1,x@variable[[step+1]][index[1]]-1),rep(0,2),xlim=c(1,x@p),ylim=c(min(0,cumsum(x@coefficient[[step+1]][index])),max(0,cumsum(x@coefficient[[step+1]][index]))),type="l",xlab=xlab,ylab=ylab) }else{ plot(NA,xlim=c(1,x@p),ylim=c(min(cumsum(x@coefficient[[step+1]][index])),max(cumsum(x@coefficient[[step+1]][index]))),xlab=xlab,ylab=ylab)} a=0 if(length(x@variable[[step+1]])>1) for(i in 1:(length(x@variable[[step+1]])-1)) { a=a+x@coefficient[[step+1]][index[i]] lines(c(x@variable[[step+1]][index[i]],x@variable[[step+1]][index[i+1]]-1),rep(a,2)) } a=a+x@coefficient[[step+1]][index[length(index)]] lines(c(x@variable[[step+1]][index[length(index)]],x@p),rep(a,2)) } else { plot(x@variable[[step+1]],x@coefficient[[step+1]],xlab=xlab,ylab=ylab,...) points((1:x@p)[-x@variable[[step+1]]],rep(0,x@p-length(x@coefficient[[step+1]])),...) } } #' Get the vector of coefficients at a given step #' #' @title get coefficients at a given step. #' @param x A LarsPath object. #' @param step The step at which you want to get the coefficients. #' @return a vector of size p containing the value of coefficients at the desired step. #' @examples #' dataset=MPA.simul(50,10000,0.4,10,50,matrix(c(0.1,0.8,0.02,0.02),nrow=2)) #' result=MPA.fusion(dataset$data,dataset$response) #' MPA.coef(result,45) #get the coefficients #' @export #' MPA.coef=function(x,step) { if(missing(x)) stop("x is missing.") if(missing(step)) stop("step is missing.") if(class(x)!="LarsPath") stop("x must be a LarsPath object") if(!.is.wholenumber(step)) stop("step must be a positive integer smaller than [email protected]") if( (step<0) || (step>x@nbStep) ) stop("step must be a positive integer smaller than [email protected]") beta=rep(0,x@p) if(x@fusion) { a=0 index=sort(x@variable[[step+1]],index.return=TRUE)$ix
for(i in 1:(length(x@variable[[step+1]])-1))
{
a=a+x@coefficient[[step+1]][index[i]]
beta[x@variable[[step+1]][index[i]]:(x@variable[[step+1]][index[i+1]]-1)]=rep(a, x@variable[[step+1]][index[i+1]]-x@variable[[step+1]][index[i]])

}
a=a+x@coefficient[[step+1]][index[length(index)]]
beta[x@variable[[step+1]][index[length(index)]]:x@p]=rep(a,x@p-x@variable[[step+1]][index[length(index)]]+1)
}
else
{
beta[x@variable[[step+1]]]=x@coefficient[[step+1]]
}

return(beta)
}


## Try the MPAlars package in your browser

Any scripts or data that you put into this service are public.

MPAlars documentation built on May 2, 2019, 5:47 p.m.