@@ -33,11 +33,15 @@ randomizedLasso = function(X,
33
33
if (is.null(noise_scale )) {
34
34
noise_scale = 0.5 * sd(y ) * sqrt(mean_diag )
35
35
}
36
-
36
+
37
+ print(paste(" ridge term" , ridge_term ))
38
+ print(paste(" noise scale" , noise_scale ))
39
+
37
40
noise_type = match.arg(noise_type )
38
41
39
42
if (noise_scale > 0 ) {
40
43
if (noise_type == ' gaussian' ) {
44
+ set.seed(1 )
41
45
perturb_ = rnorm(p ) * noise_scale
42
46
}
43
47
else if (noise_type == ' laplace' ) {
@@ -65,8 +69,8 @@ randomizedLasso = function(X,
65
69
nactive = as.integer(0 )
66
70
67
71
result = solve_QP_wide(X , # design matrix
68
- lam / n , # vector of Lagrange multipliers
69
- ridge_term / n , # ridge_term
72
+ lam / n , # vector of Lagrange multipliers
73
+ ridge_term / n , # ridge_term
70
74
max_iter ,
71
75
soln ,
72
76
linear_func ,
@@ -76,12 +80,12 @@ randomizedLasso = function(X,
76
80
nactive ,
77
81
kkt_tol ,
78
82
objective_tol ,
79
- parameter_tol ,
83
+ parameter_tol ,
80
84
p ,
81
- objective_stop , # objective_stop
82
- kkt_stop , # kkt_stop
83
- parameter_stop ) # param_stop
84
-
85
+ objective_stop , # objective_stop
86
+ kkt_stop , # kkt_stop
87
+ parameter_stop ) # param_stop
88
+
85
89
sign_soln = sign(result $ soln )
86
90
87
91
unpenalized = lam == 0
@@ -96,7 +100,11 @@ randomizedLasso = function(X,
96
100
97
101
observed_scalings = abs(result $ soln )[active ]
98
102
observed_unpen = result $ soln [unpenalized ]
99
- observed_subgrad = result $ gradient [inactive ]
103
+ observed_subgrad = - n * result $ gradient [inactive ]
104
+
105
+ if (length(which(abs(observed_subgrad )> lam [1 ]))){
106
+ print(" subgradient eq not satisfied" )
107
+ }
100
108
101
109
observed_opt_state = c(observed_unpen , observed_scalings , observed_subgrad )
102
110
@@ -111,14 +119,15 @@ randomizedLasso = function(X,
111
119
coef_term = L_E
112
120
113
121
signs_ = c(rep(1 , sum(unpenalized )), sign_soln [active ])
122
+
123
+ coef_term [active ,] = coef_term [active ,] + ridge_term * diag(rep(1 , sum(active ))) # ridge term
124
+
114
125
if (length(signs_ ) == 1 ) {
115
- coef_term = coef_term * signs_
126
+ coef_term = coef_term * signs_
116
127
} else {
117
- coef_term = coef_term %*% diag(signs_ ) # scaligns are non-negative
128
+ coef_term = coef_term %*% diag(signs_ ) # scaligns are non-negative
118
129
}
119
-
120
- coef_term [active ,] = coef_term [active ,] + ridge_term * diag(rep(1 , sum(active ))) # ridge term
121
-
130
+
122
131
subgrad_term = matrix (0 , p , sum(inactive )) # for subgrad
123
132
for (i in 1 : sum(inactive )) {
124
133
subgrad_term [inactive_set [i ], i ] = 1
@@ -155,7 +164,8 @@ randomizedLasso = function(X,
155
164
inactive_lam = lam [inactive_set ]
156
165
inactive_start = sum(unpenalized ) + sum(active )
157
166
active_start = sum(unpenalized )
158
-
167
+
168
+
159
169
# XXX only for Gaussian so far
160
170
161
171
log_optimization_density = function (opt_state ) {
@@ -185,9 +195,11 @@ randomizedLasso = function(X,
185
195
optimization_transform = opt_transform ,
186
196
internal_transform = internal_transform ,
187
197
log_optimization_density = log_optimization_density ,
188
- observed_opt_state = observed_opt_state ,
198
+ observed_opt_state = observed_opt_state ,
189
199
observed_raw = observed_raw ,
190
- noise_scale = noise_scale
200
+ noise_scale = noise_scale ,
201
+ soln = result $ soln ,
202
+ perturb = perturb_
191
203
))
192
204
193
205
}
@@ -314,19 +326,22 @@ conditional_density = function(noise_scale, lasso_soln) {
314
326
lasso_soln $ log_optimization_density = log_condl_optimization_density
315
327
lasso_soln $ observed_opt_state = observed_opt_state [1 : nactive ]
316
328
lasso_soln $ optimization_transform = opt_transform
317
- return (lasso_soln )
329
+ reduced_opt_transform = list (linear_term = reduced_B , offset_term = reduced_beta_offset )
330
+ return (list (lasso_soln = lasso_soln ,
331
+ reduced_opt_transform = reduced_opt_transform ))
318
332
}
319
333
320
334
randomizedLassoInf = function (X ,
321
335
y ,
322
336
lam ,
337
+ sampler = " A" ,
323
338
sigma = NULL ,
324
339
noise_scale = NULL ,
325
340
ridge_term = NULL ,
326
341
condition_subgrad = TRUE ,
327
342
level = 0.9 ,
328
- nsample = 10000 ,
329
- burnin = 2000 ,
343
+ nsample = 10000 ,
344
+ burnin = 2000 ,
330
345
max_iter = 100 , # how many iterations for each optimization problem
331
346
kkt_tol = 1.e-4 , # tolerance for the KKT conditions
332
347
parameter_tol = 1.e-8 , # tolerance for relative convergence of parameter
@@ -353,22 +368,35 @@ randomizedLassoInf = function(X,
353
368
parameter_stop = parameter_stop )
354
369
355
370
active_set = lasso_soln $ active_set
356
- if (length(active_set )== 0 ){
371
+ nactive = length(active_set )
372
+ print(paste(" nactive" , nactive ))
373
+ if (nactive == 0 ){
357
374
return (list (active_set = active_set , pvalues = c(), ci = c()))
358
375
}
359
376
inactive_set = lasso_soln $ inactive_set
360
- nactive = length( active_set )
377
+
361
378
362
379
noise_scale = lasso_soln $ noise_scale # set to default value in randomizedLasso
363
380
364
381
if (condition_subgrad == TRUE ){
365
- lasso_soln = conditional_density(noise_scale , lasso_soln )
382
+ condl_lasso = conditional_density(noise_scale , lasso_soln )
383
+ lasso_soln = condl_lasso $ lasso_soln
384
+ reduced_opt_transform = condl_lasso $ reduced_opt_transform
366
385
}
367
386
368
387
ndim = length(lasso_soln $ observed_opt_state )
369
-
370
- S = sample_opt_variables(lasso_soln , jump_scale = rep(1 / sqrt(n ), ndim ), nsample = nsample )
371
- opt_samples = as.matrix(S $ samples [(burnin + 1 ): nsample ,,drop = FALSE ])
388
+
389
+ if (sampler == " R" ){
390
+ S = sample_opt_variables(lasso_soln , jump_scale = rep(1 / sqrt(n ), ndim ), nsample = nsample )
391
+ opt_samples = as.matrix(S $ samples [(burnin + 1 ): nsample ,,drop = FALSE ])
392
+ } else if (sampler == " A" ){
393
+ opt_samples = gaussian_sampler(noise_scale ,
394
+ lasso_soln $ observed_opt_state ,
395
+ reduced_opt_transform $ linear_term ,
396
+ reduced_opt_transform $ offset_term ,
397
+ nsamples = nsample )
398
+ opt_sample = opt_samples [(burnin + 1 ): nsample ,]
399
+ }
372
400
373
401
X_E = X [, active_set ]
374
402
X_minusE = X [, inactive_set ]
@@ -458,3 +486,6 @@ randomizedLassoInf = function(X,
458
486
}
459
487
return (list (active_set = active_set , pvalues = pvalues , ci = ci ))
460
488
}
489
+
490
+
491
+
0 commit comments