|
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 |
|