@@ -33,7 +33,7 @@ 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
37
noise_type = match.arg(noise_type )
38
38
39
39
if (noise_scale > 0 ) {
@@ -65,8 +65,8 @@ randomizedLasso = function(X,
65
65
nactive = as.integer(0 )
66
66
67
67
result = solve_QP_wide(X , # design matrix
68
- lam / n , # vector of Lagrange multipliers
69
- ridge_term / n , # ridge_term
68
+ lam / n , # vector of Lagrange multipliers
69
+ ridge_term / n , # ridge_term
70
70
max_iter ,
71
71
soln ,
72
72
linear_func ,
@@ -76,12 +76,12 @@ randomizedLasso = function(X,
76
76
nactive ,
77
77
kkt_tol ,
78
78
objective_tol ,
79
- parameter_tol ,
79
+ parameter_tol ,
80
80
p ,
81
- objective_stop , # objective_stop
82
- kkt_stop , # kkt_stop
83
- parameter_stop ) # param_stop
84
-
81
+ objective_stop , # objective_stop
82
+ kkt_stop , # kkt_stop
83
+ parameter_stop ) # param_stop
84
+
85
85
sign_soln = sign(result $ soln )
86
86
87
87
unpenalized = lam == 0
@@ -96,7 +96,11 @@ randomizedLasso = function(X,
96
96
97
97
observed_scalings = abs(result $ soln )[active ]
98
98
observed_unpen = result $ soln [unpenalized ]
99
- observed_subgrad = result $ gradient [inactive ]
99
+ observed_subgrad = - n * result $ gradient [inactive ]
100
+
101
+ if (length(which(abs(observed_subgrad )> lam [1 ]))){
102
+ print(" subgradient eq not satisfied" )
103
+ }
100
104
101
105
observed_opt_state = c(observed_unpen , observed_scalings , observed_subgrad )
102
106
@@ -111,14 +115,15 @@ randomizedLasso = function(X,
111
115
coef_term = L_E
112
116
113
117
signs_ = c(rep(1 , sum(unpenalized )), sign_soln [active ])
118
+
119
+ coef_term [active ,] = coef_term [active ,] + ridge_term * diag(rep(1 , sum(active ))) # ridge term
120
+
114
121
if (length(signs_ ) == 1 ) {
115
- coef_term = coef_term * signs_
122
+ coef_term = coef_term * signs_
116
123
} else {
117
- coef_term = coef_term %*% diag(signs_ ) # scaligns are non-negative
124
+ coef_term = coef_term %*% diag(signs_ ) # scaligns are non-negative
118
125
}
119
-
120
- coef_term [active ,] = coef_term [active ,] + ridge_term * diag(rep(1 , sum(active ))) # ridge term
121
-
126
+
122
127
subgrad_term = matrix (0 , p , sum(inactive )) # for subgrad
123
128
for (i in 1 : sum(inactive )) {
124
129
subgrad_term [inactive_set [i ], i ] = 1
@@ -155,7 +160,8 @@ randomizedLasso = function(X,
155
160
inactive_lam = lam [inactive_set ]
156
161
inactive_start = sum(unpenalized ) + sum(active )
157
162
active_start = sum(unpenalized )
158
-
163
+
164
+
159
165
# XXX only for Gaussian so far
160
166
161
167
log_optimization_density = function (opt_state ) {
@@ -185,9 +191,11 @@ randomizedLasso = function(X,
185
191
optimization_transform = opt_transform ,
186
192
internal_transform = internal_transform ,
187
193
log_optimization_density = log_optimization_density ,
188
- observed_opt_state = observed_opt_state ,
194
+ observed_opt_state = observed_opt_state ,
189
195
observed_raw = observed_raw ,
190
- noise_scale = noise_scale
196
+ noise_scale = noise_scale ,
197
+ soln = result $ soln ,
198
+ perturb = perturb_
191
199
))
192
200
193
201
}
@@ -239,7 +247,6 @@ importance_weight = function(noise_scale,
239
247
A = apply(A , 2 , function (x ) {return (x + target_transform $ offset_term + opt_transform $ offset_term )})
240
248
log_num = - apply(A ^ 2 , 2 , sum ) / noise_scale ^ 2
241
249
} else {
242
-
243
250
log_num = log_density_gaussian_(noise_scale ,
244
251
target_transform $ linear_term ,
245
252
as.matrix(target_sample ),
@@ -262,6 +269,15 @@ importance_weight = function(noise_scale,
262
269
W = W - max(W )
263
270
return (exp(W ))
264
271
}
272
+
273
+ get_mean_cov = function (noise_scale , linear_term , offset_term ){
274
+ temp = solve(t(linear_term ) %*% linear_term )
275
+ cov = noise_scale ^ 2 * temp
276
+ mean = temp %*% t(linear_term ) %*% offset_term
277
+ return (list (mean = mean , cov = cov ))
278
+ }
279
+
280
+
265
281
266
282
conditional_density = function (noise_scale , lasso_soln ) {
267
283
@@ -306,7 +322,9 @@ conditional_density = function(noise_scale, lasso_soln) {
306
322
lasso_soln $ log_optimization_density = log_condl_optimization_density
307
323
lasso_soln $ observed_opt_state = observed_opt_state [1 : nactive ]
308
324
lasso_soln $ optimization_transform = opt_transform
309
- return (lasso_soln )
325
+ reduced_opt_transform = list (linear_term = reduced_B , offset_term = reduced_beta_offset )
326
+ return (list (lasso_soln = lasso_soln ,
327
+ reduced_opt_transform = reduced_opt_transform ))
310
328
}
311
329
312
330
randomizedLassoInf = function (X ,
@@ -317,8 +335,9 @@ randomizedLassoInf = function(X,
317
335
ridge_term = NULL ,
318
336
condition_subgrad = TRUE ,
319
337
level = 0.9 ,
320
- nsample = 10000 ,
321
- burnin = 2000 ,
338
+ sampler = c(" norejection" , " adaptMCMC" ),
339
+ nsample = 10000 ,
340
+ burnin = 2000 ,
322
341
max_iter = 100 , # how many iterations for each optimization problem
323
342
kkt_tol = 1.e-4 , # tolerance for the KKT conditions
324
343
parameter_tol = 1.e-8 , # tolerance for relative convergence of parameter
@@ -345,22 +364,47 @@ randomizedLassoInf = function(X,
345
364
parameter_stop = parameter_stop )
346
365
347
366
active_set = lasso_soln $ active_set
348
- if (length(active_set )== 0 ){
367
+ nactive = length(active_set )
368
+
369
+ if (nactive == 0 ){
349
370
return (list (active_set = active_set , pvalues = c(), ci = c()))
350
371
}
351
372
inactive_set = lasso_soln $ inactive_set
352
- nactive = length(active_set )
353
-
373
+
354
374
noise_scale = lasso_soln $ noise_scale # set to default value in randomizedLasso
355
-
356
- if (condition_subgrad == TRUE ){
357
- lasso_soln = conditional_density(noise_scale , lasso_soln )
358
- }
375
+
376
+ constraints = matrix (0 ,nactive ,2 )
377
+ constraints [,2 ] = Inf
378
+ if (condition_subgrad == TRUE ){
379
+ condl_lasso = conditional_density(noise_scale , lasso_soln )
380
+ lasso_soln = condl_lasso $ lasso_soln
381
+ cur_opt_transform = condl_lasso $ reduced_opt_transform
382
+ } else {
383
+ if (nactive < p ){
384
+ subgrad_constraints = matrix (- lam , p - nactive , 2 )
385
+ subgrad_constraints [,2 ]= lam
386
+ constraints = rbind(constraints , subgrad_constraints )
387
+ }
388
+ cur_opt_transform = list (linear_term = lasso_soln $ optimization_transform $ linear_term ,
389
+ offset_term = lasso_soln $ optimization_transform $ offset_term + lasso_soln $ observed_raw )
390
+ }
359
391
360
392
ndim = length(lasso_soln $ observed_opt_state )
361
-
362
- S = sample_opt_variables(lasso_soln , jump_scale = rep(1 / sqrt(n ), ndim ), nsample = nsample )
363
- opt_samples = as.matrix(S $ samples [(burnin + 1 ): nsample ,,drop = FALSE ])
393
+
394
+ sampler = match.arg(sampler )
395
+
396
+ if (sampler == " adaptMCMC" ){
397
+ S = sample_opt_variables(lasso_soln , jump_scale = rep(1 / sqrt(n ), ndim ), nsample = nsample )
398
+ opt_samples = as.matrix(S $ samples [(burnin + 1 ): nsample ,,drop = FALSE ])
399
+ } else if (sampler == " norejection" ) {
400
+ opt_samples = gaussian_sampler(noise_scale ,
401
+ lasso_soln $ observed_opt_state ,
402
+ cur_opt_transform $ linear_term ,
403
+ cur_opt_transform $ offset_term ,
404
+ constraints ,
405
+ nsamples = nsample )
406
+ opt_sample = opt_samples [(burnin + 1 ): nsample ,]
407
+ }
364
408
365
409
X_E = X [, active_set ]
366
410
X_minusE = X [, inactive_set ]
@@ -404,7 +448,6 @@ randomizedLassoInf = function(X,
404
448
cur_linear = reduced_target_opt_linear [,2 : ncol(reduced_target_opt_linear )]
405
449
cur_offset = temp %*% opt_transform $ offset_term
406
450
cur_transform = list (linear_term = as.matrix(cur_linear ), offset_term = cur_offset )
407
-
408
451
raw = target_transform $ linear_term * observed_target [i ] + target_transform $ offset_term
409
452
} else {
410
453
cur_transform = opt_transform
@@ -450,3 +493,6 @@ randomizedLassoInf = function(X,
450
493
}
451
494
return (list (active_set = active_set , pvalues = pvalues , ci = ci ))
452
495
}
496
+
497
+
498
+
0 commit comments