Diff of /Fun_NSLR.R [000000] .. [6ff15d]

Switch to unified view

a b/Fun_NSLR.R
1
update.diagMatrix = function(X, w, gate = 0){
2
  # ------------------
3
  # X   is a n x (p+1) matrix
4
  # w   is a (p+1) x 1 vector
5
  # ------------------
6
  n = nrow(X)
7
  # ------------------
8
  if(gate == 1){
9
    D = diag(n)*0.25
10
    return(D)
11
  }
12
  # ------------------
13
  pp = 1/(1 + exp(-X%*%w))
14
  D = diag(n)
15
  for(i in 1:n){
16
    D[i,i] = max(0.00001,pp[i]*(1-pp[i]))
17
    #D[i,i] = pp[i]*(1-pp[i])
18
  }
19
  return(D)
20
}
21
update.zVector= function(X, y, w, D){
22
  # ------------------
23
  # X   is a n x (p+1) matrix
24
  # y   is a n x 1 vector
25
  # w   is a (p+1) x 1 vector
26
  # D   is a n x n matrix
27
  # ------------------
28
  n = nrow(X)
29
  z = matrix(0,nrow  = n)
30
  
31
  Xw = X%*%w
32
  pp = 1/(1 + exp(-Xw))
33
  for(i in 1:n){
34
    z[i] = Xw[i] + (y[i]-pp[i])/D[i,i]
35
  }
36
  return(z)
37
}
38
# Soft-thresholding function
39
Soft.thresholding = function(x,lamb){
40
  if (lamb==0) {return(x)}
41
  value1=abs(x)-lamb; value1[round(value1,7)<=0]=0
42
  value2=sign(x)*value1
43
  return(value2)
44
}
45
46
# Objective function
47
objective = function(X,y,w){
48
  # -----------------
49
  # X   is a n x (p+1) matrix
50
  # y   is a n x 1 vector
51
  # w   is a (p+1) x 1 vector
52
  # ------------------
53
  value = t(y)%*%X%*%w - sum(log(1+exp(X%*%w)))
54
  value = value/length(y)
55
}
56
57
logreg.obj = function(X,y,w,M,lambda0, alpha){
58
  # -----------------
59
  # X   is a n x (p+1) matrix
60
  # y   is a n x 1 vector
61
  # w   is a (p+1) x 1 vector
62
  # ------------------
63
  s = X%*%w
64
  v = y * s - log(1+exp(s))
65
  L = mean(v)
66
  
67
  w1 = w[1:(length(w)-1)]
68
  R1 = lambda0 *alpha* sum(abs(w1))
69
  R2 = lambda0 *(1-alpha)*t(w)%*%M%*%w/2 
70
  R1 + R2 - L
71
}
72
73
abs.logreg.obj = function(X,y,w,M,lambda0, alpha){
74
  # -----------------
75
  # X   is a n x (p+1) matrix
76
  # y   is a n x 1 vector
77
  # w   is a (p+1) x 1 vector
78
  # ------------------
79
  s = X%*%w
80
  v = y * s - log(1+exp(s))
81
  L = mean(v)
82
  
83
  w1 = w[1:(length(w)-1)]
84
  R1 = lambda0 *alpha* sum(abs(w1))
85
  R2 = lambda0 *(1-alpha)*abs(t(w))%*%M%*%abs(w)/2 
86
  
87
  R1 + R2 - L
88
}
89
90
gelnet.logreg.obj2 = function(X,y,w,b, M,l1, l2){
91
92
  s <- X %*% w + b
93
  v <- y * s - log(1+exp(s))
94
  LL <- mean(v)
95
96
  R1 = l1*sum(abs(w))
97
  R2 = l2*t(w)%*%M%*%w/2
98
  R1 + R2 - LL
99
}
100
# ------------------------------------------------------------------
101
# ------------------------------------------------------------------
102
# mian function
103
# Network-regularized Sparse Logistic Regression (NSLR) 
104
SGNLR = function(X, y, M, lambda0, alpha, niter=100, gate = 0){
105
  # -----------------
106
  # X   is a n x p matrix
107
  # y   is a n x 1 vector
108
  # M   is a (p+1) x (p+1) matrix
109
  # -----------------
110
  if(!is.matrix(y)){y = matrix(y,ncol = 1)}
111
  if(!is.matrix(X)){X = matrix(y,ncol = ncol(X))}
112
  
113
  n = dim(X)[1]; p = dim(X)[2]
114
  
115
  # Adjusting penalty parameters
116
  lambda = n*alpha*lambda0
117
  eta = n*(1-alpha)*lambda0
118
  
119
  X = cbind(X,rep(1,n))
120
  # X   is a n x (p+1) matrix
121
  
122
  if(dim(M)[1]!= p+1){M = cbind(M,rep(0,p)); M = rbind(M,rep(0,p+1))} 
123
  # M   is a (p+1) x (p+1) matrix
124
  # -----------------
125
  # Initialization
126
  w = matrix(0, nrow = p+1)
127
  err=0.0001
128
  
129
  obj=log.likelihhod = NULL
130
  for(i in 1:niter){
131
    w0 = w
132
    D = update.diagMatrix(X, w, gate)
133
    z = update.zVector(X, y, w, D)
134
    XDX = t(X)%*%D%*%X + eta*M
135
    t   = t(X)%*%D%*%z
136
    for(j in 1:p){
137
      w[j] = 0
138
      w[j] = (Soft.thresholding(t[j]-t(w)%*%XDX[j,], lambda))/XDX[j,j]
139
    }
140
    
141
    w[p+1] = 0
142
    w[p+1] = (t[p+1]-t(w)%*%XDX[p+1,])/XDX[p+1,p+1]
143
    
144
    # Calculate J (for testing convergence)
145
    log.likelihhod = c(log.likelihhod,objective(X,y,w))
146
    obj = c(obj,logreg.obj(X,y,w,M,lambda0, alpha))
147
148
    if(i>3&&abs(obj[i]-obj[i-1])/abs(obj[i-1])<0.00001){break}
149
  }
150
  names(w) = c(paste("w", 1:(length(w)-1), sep = ""), "Intercept")
151
  return(list(w=w, log.likelihhod = log.likelihhod,obj=obj))
152
}
153
154
# Absolute Network-regularized Logistic Regression (AbsNet.LR)
155
abs.SNLR = function(X, y, M, lambda0, alpha, niter=100, gate = 0){
156
  # -----------------
157
  # X   is a n x p matrix
158
  # y   is a n x 1 vector
159
  # M   is a (p+1) x (p+1) matrix
160
  # example:
161
  # -----------------
162
  if(!is.matrix(y)){y = matrix(y,ncol = 1)}
163
  if(!is.matrix(X)){X = matrix(y,ncol = ncol(X))}
164
165
  n = dim(X)[1]; p = dim(X)[2]
166
167
  # Adjusting penalty parameters
168
  lambda = n*alpha*lambda0
169
  eta = n*(1-alpha)*lambda0
170
171
  X = cbind(X,rep(1,n))
172
  # X   is a n x (p+1) matrix
173
174
  if(dim(M)[1]!= p+1){M = cbind(M,rep(0,p)); M = rbind(M,rep(0,p+1))}
175
  # M   is a (p+1) x (p+1) matrix
176
  # -----------------
177
  # Initialization
178
  w = matrix(0, nrow = p+1)
179
  err=0.0001
180
181
  obj = NULL
182
  for(i in 1:niter){
183
    w0 = w
184
    D = update.diagMatrix(X, w, gate)
185
    z = update.zVector(X, y, w, D)
186
    B = t(X)%*%D%*%X
187
    t   = t(X)%*%D%*%z
188
    for(j in 1:p){
189
      w[j] = 0
190
      soft.value = lambda + 2*eta*abs(t(w))%*%M[j,]
191
      w[j] = (Soft.thresholding(t[j]-t(w)%*%B[j,], soft.value))/(B[j,j]+2*eta*M[j,j])
192
    }
193
    XDX = B + eta*M
194
    w[p+1] = 0
195
    w[p+1] = (t[p+1]-t(w)%*%XDX[p+1,])/XDX[p+1,p+1]
196
197
    # Calculate J (for testing convergence)
198
    obj = c(obj,abs.logreg.obj(X,y,w,M,lambda0, alpha))
199
200
    if(i>3&&abs(obj[i]-obj[i-1])/abs(obj[i-1])<0.00001){break}
201
  }
202
  names(w) = c(paste("w", 1:(length(w)-1), sep = ""), "Intercept")
203
  return(list(w=w, obj = obj))
204
}
205
# ------------------------------------------------------------------
206
predict.SGNLR = function(Train.dat,True.label,Est.w){
207
  # -----------------
208
  # X   is a n x p matrix
209
  # w   is a (p+1) x 1 vector
210
  # w = (w1,w2,...,b)
211
  # -----------------
212
  library(pROC)
213
  X = Train.dat; y0 = True.label; w = Est.w
214
  n = dim(X)[1]; p = dim(X)[2]
215
  if(!is.matrix(w)){w = matrix(c(w),ncol = 1)}
216
  X = cbind(X,rep(1,n)) # X is a n x (p+1) matrix
217
  pp = 1/(1+exp(-X%*%w))
218
  y = rep(1,n)
219
  y[pp<0.5] = 0
220
  accuracy.rate = length(which(y==y0))/n 
221
  # AUC = accuracy.rate
222
  AUC = auc(y0, c(pp))[1]
223
  # AUC = roc(as.factor(y0), c(pp))$auc[1]
224
  
225
  return(list(pp=pp, y=y, acc = accuracy.rate, AUC = AUC))
226
}
227