LASSO算法

徐国盛 浙江财经大学

  ci = 100
  beta0 = c(rep(0,15))
  AA = matrix(0,100,length(beta0))
  for(j in 79:100)  
  {  
    betam = c(7,-5,rep(0,13))
    betam <- as.matrix(betam)
    n = 150
    v = 2
    xm1 = matrix(0,n,v)
    for(i in 1:n)
    {
      xm1[i,] =0.2*rbinom(2,1,0.5)
    }
    xm2 = matrix(0,n,length(betam)-v)
    for(i in 1:n)
    {
      xm2[i,] = rnorm(length(betam)-v,0,10)
    }
    xm =  cbind(xm1,xm2)
    
    u = 0
    for(i in 1:n)
    {
      u[i] =as.numeric(xm[i,]%*%betam)
    }
    #ym = rgamma(n,1)
    #ym = (ym - mean(ym))
    #
    ym = 0
    for(i in 1:n)
    {
      ym[i] = rgamma(1,exp(u[i]))
    }
    y <- as.matrix(ym-mean(ym))
    x <- xm 
    ##########################################################
    likely<- function(beta){
      ll = 0;
      for(i in 1:nrow(x)){
        t = as.numeric(x[i,]%*%as.matrix(beta))
        ll[i] = as.numeric(y[i,])*t-exp(t)
      }
      l = -sum(ll)
      return(l)
    }
    beta0 <- optim(betam,likely)$par
    ##############################################
    #求lammda值,满足BIC准则
    
    n = nrow(x) 
    lammda = 0
    for(i in 1:ncol(x)){
      lammda[i] = as.numeric(log(n)/(n*abs(beta0[i])))
    }
    #求惩罚项之和
    
    pena <- function(beta){
      spena = 0
      for(i in 1:ncol(x)){
        spena[i] =lammda[i]*beta[i]^2/abs(beta0[i])
      }
      spena = sum(spena)
      return(spena)
    }
    #构造目标函数
    
    likely2 <- function(beta){
      
      l2 = likely(beta) + nrow(x)*pena(beta)
      return(l2)
    }
    #进行迭代计算,求得收敛的beta。
    
    iterate <- function(beta){
      std = 1
      while(std > 0.000001){
        root = optim(beta,likely2)$par
        temp = as.matrix(root - beta)
        std = crossprod(temp,temp)
        beta0 = root
        beta = root
        # write.table(beta,file = "betam2.txt",append = T,eol = "\r\n")
        # write.table(std,file = "stdm2.txt",append = T,eol = "\r\n")
      }
      answer = beta
      return(answer)
    }
    AA[j,] = iterate(beta0)
    write.table(AA[j,],"AA.txt",append=T,eol="\r\n")#linux下为eol="\n"
  }