3
3
#
4
4
# min 1/2 || y - \beta_0 - X \beta ||_2^2 + \lambda || \beta ||_1 - \omega^T\beta + \frac{\epsilon}{2} \|\beta\|^2_2
5
5
6
- randomizedLASSO = function (X ,
6
+ randomizedLasso = function (X ,
7
7
y ,
8
8
lam ,
9
- noise_scale ,
10
- ridge_term ,
9
+ noise_scale = NULL ,
10
+ ridge_term = NULL ,
11
11
noise_type = c(' gaussian' , ' laplace' ),
12
12
max_iter = 100 , # how many iterations for each optimization problem
13
13
kkt_tol = 1.e-4 , # tolerance for the KKT conditions
@@ -20,6 +20,21 @@ randomizedLASSO = function(X,
20
20
21
21
n = nrow(X ); p = ncol(X )
22
22
23
+ mean_diag = mean(apply(X ^ 2 , 2 , sum ))
24
+
25
+ # default ridge term
26
+
27
+ if (is.null(ridge_term )) {
28
+ ridge_term = sqrt(mean_diag ) * sd(y ) / sqrt(n )
29
+ }
30
+
31
+ # default noise level
32
+
33
+ if (is.null(noise_scale )) {
34
+ noise_scale = 0.5 * sd(y ) * sqrt(mean_diag )
35
+ }
36
+
37
+ print(c(noise_scale , ridge_term ))
23
38
noise_type = match.arg(noise_type )
24
39
25
40
if (noise_scale > 0 ) {
@@ -246,10 +261,10 @@ conditional_density = function(noise_scale, lasso_soln) {
246
261
if (sum(opt_state < 0 ) > 0 ) {
247
262
return (- Inf )
248
263
}
249
- D = selectiveInference ::: log_density_gaussian_conditional_(noise_scale ,
250
- reduced_B ,
251
- as.matrix(opt_state ),
252
- reduced_beta_offset )
264
+ D = log_density_gaussian_conditional_(noise_scale ,
265
+ reduced_B ,
266
+ as.matrix(opt_state ),
267
+ reduced_beta_offset )
253
268
return (D )
254
269
}
255
270
lasso_soln $ log_optimization_density = log_condl_optimization_density
@@ -258,12 +273,18 @@ conditional_density = function(noise_scale, lasso_soln) {
258
273
return (lasso_soln )
259
274
}
260
275
261
- randomized_inference = function (X , y , sigma , lam , noise_scale , ridge_term ,
262
- condition_subgrad = FALSE , level = 0.9 ){
276
+ randomizedLassoInf = function (X ,
277
+ y ,
278
+ lam ,
279
+ sigma = NULL ,
280
+ noise_scale = NULL ,
281
+ ridge_term = NULL ,
282
+ condition_subgrad = TRUE ,
283
+ level = 0.9 ) {
263
284
264
285
n = nrow(X )
265
286
p = ncol(X )
266
- lasso_soln = selectiveInference ::: randomizedLASSO (X , y , lam , noise_scale , ridge_term )
287
+ lasso_soln = randomizedLasso (X , y , lam , noise_scale , ridge_term )
267
288
active_set = lasso_soln $ active_set
268
289
inactive_set = lasso_soln $ inactive_set
269
290
nactive = length(active_set )
@@ -274,12 +295,20 @@ randomized_inference = function(X, y, sigma, lam, noise_scale, ridge_term,
274
295
275
296
dim = length(lasso_soln $ observed_opt_state )
276
297
print(paste(" chain dim" , dim ))
277
- S = selectiveInference ::: sample_opt_variables(lasso_soln , jump_scale = rep(1 / sqrt(n ), dim ), nsample = 10000 )
298
+ S = sample_opt_variables(lasso_soln , jump_scale = rep(1 / sqrt(n ), dim ), nsample = 10000 )
278
299
opt_samples = S $ samples [2001 : 10000 ,]
279
300
print(paste(" dim opt samples" , toString(dim(opt_samples ))))
280
301
281
302
X_E = X [, active_set ]
282
303
X_minusE = X [, inactive_set ]
304
+
305
+ # if no sigma given, use OLS estimate
306
+
307
+ if (is.null(sigma )) {
308
+ lm_y = lm(y ~ X [,E ] - 1 )
309
+ sigma = sum(resid(lm_y )^ 2 / lm_y $ df.resid )
310
+ }
311
+ print(c(sigma , ' sigma' ))
283
312
target_cov = solve(t(X_E ) %*% X_E )* sigma ^ 2
284
313
cov_target_internal = rbind(target_cov , matrix (0 , nrow = p - nactive , ncol = nactive ))
285
314
observed_target = solve(t(X_E ) %*% X_E ) %*% t(X_E ) %*% y
@@ -291,20 +320,20 @@ randomized_inference = function(X, y, sigma, lam, noise_scale, ridge_term,
291
320
pvalues = rep(0 , nactive )
292
321
ci = matrix (0 , nactive , 2 )
293
322
for (i in 1 : nactive ){
294
- target_transform = selectiveInference ::: linear_decomposition(observed_target [i ],
295
- observed_internal ,
296
- target_cov [i ,i ],
297
- cov_target_internal [,i ],
298
- internal_transform )
323
+ target_transform = linear_decomposition(observed_target [i ],
324
+ observed_internal ,
325
+ target_cov [i ,i ],
326
+ cov_target_internal [,i ],
327
+ internal_transform )
299
328
target_sample = rnorm(nrow(opt_samples )) * sqrt(target_cov [i ,i ])
300
329
301
330
pivot = function (candidate ){
302
- weights = selectiveInference ::: importance_weight(noise_scale ,
303
- t(as.matrix(target_sample )) + candidate ,
304
- t(opt_samples ),
305
- opt_transform ,
306
- target_transform ,
307
- observed_raw )
331
+ weights = importance_weight(noise_scale ,
332
+ t(as.matrix(target_sample )) + candidate ,
333
+ t(opt_samples ),
334
+ opt_transform ,
335
+ target_transform ,
336
+ observed_raw )
308
337
return (mean((target_sample + candidate < observed_target [i ])* weights )/ mean(weights ))
309
338
}
310
339
rootU = function (candidate ){
0 commit comments