Skip to content

Commit df777e3

Browse files
using some default arguments now -- bug in C code for densities
1 parent 1115635 commit df777e3

File tree

4 files changed

+54
-62
lines changed

4 files changed

+54
-62
lines changed

selectiveInference/R/RcppExports.R

Lines changed: 0 additions & 35 deletions
This file was deleted.

selectiveInference/R/funs.randomized.R

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
#
44
# min 1/2 || y - \beta_0 - X \beta ||_2^2 + \lambda || \beta ||_1 - \omega^T\beta + \frac{\epsilon}{2} \|\beta\|^2_2
55

6-
randomizedLASSO = function(X,
6+
randomizedLasso = function(X,
77
y,
88
lam,
9-
noise_scale,
10-
ridge_term,
9+
noise_scale=NULL,
10+
ridge_term=NULL,
1111
noise_type=c('gaussian', 'laplace'),
1212
max_iter=100, # how many iterations for each optimization problem
1313
kkt_tol=1.e-4, # tolerance for the KKT conditions
@@ -20,6 +20,21 @@ randomizedLASSO = function(X,
2020

2121
n = nrow(X); p = ncol(X)
2222

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))
2338
noise_type = match.arg(noise_type)
2439

2540
if (noise_scale > 0) {
@@ -246,10 +261,10 @@ conditional_density = function(noise_scale, lasso_soln) {
246261
if (sum(opt_state < 0) > 0) {
247262
return(-Inf)
248263
}
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)
253268
return(D)
254269
}
255270
lasso_soln$log_optimization_density = log_condl_optimization_density
@@ -258,12 +273,18 @@ conditional_density = function(noise_scale, lasso_soln) {
258273
return(lasso_soln)
259274
}
260275

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) {
263284

264285
n = nrow(X)
265286
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)
267288
active_set = lasso_soln$active_set
268289
inactive_set = lasso_soln$inactive_set
269290
nactive = length(active_set)
@@ -274,12 +295,20 @@ randomized_inference = function(X, y, sigma, lam, noise_scale, ridge_term,
274295

275296
dim = length(lasso_soln$observed_opt_state)
276297
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)
278299
opt_samples = S$samples[2001:10000,]
279300
print(paste("dim opt samples", toString(dim(opt_samples))))
280301

281302
X_E = X[, active_set]
282303
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'))
283312
target_cov = solve(t(X_E) %*% X_E)*sigma^2
284313
cov_target_internal = rbind(target_cov, matrix(0, nrow=p-nactive, ncol=nactive))
285314
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,
291320
pvalues = rep(0, nactive)
292321
ci = matrix(0, nactive, 2)
293322
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)
299328
target_sample = rnorm(nrow(opt_samples)) * sqrt(target_cov[i,i])
300329

301330
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)
308337
return(mean((target_sample+candidate<observed_target[i])*weights)/mean(weights))
309338
}
310339
rootU = function(candidate){

tests/randomized/test_instances.R

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ collect_results = function(n,p,s, nsim=100, level=0.9){
3636
X=data$X
3737
y=data$y
3838
beta=data$beta
39-
ridge_term=sd(y)/sqrt(n)
40-
noise_scale = sd(y)/2
41-
result = selectiveInference:::randomized_inference(X,y,sigma,lam,noise_scale,ridge_term, TRUE, level)
39+
result = selectiveInference:::randomizedLassoInf(X, y, sigma, lam, level=level)
4240
true_beta = beta[result$active_set]
4341
coverage = rep(0, nrow(result$ci))
4442
for (i in 1:nrow(result$ci)){

tests/randomized/test_randomized.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ smoke_test = function() {
77
lam = 20 / sqrt(n)
88
noise_scale = 0.01 * sqrt(n)
99
ridge_term = .1 / sqrt(n)
10-
selectiveInference:::randomizedLASSO(X, y, lam, noise_scale, ridge_term)
10+
selectiveInference:::randomizedLasso(X, y, lam, noise_scale, ridge_term)
1111
}
1212

1313
A = smoke_test()
@@ -20,7 +20,7 @@ sampler_test = function() {
2020
lam = 20 / sqrt(n)
2121
noise_scale = 0.01 * sqrt(n)
2222
ridge_term = .1 / sqrt(n)
23-
obj = selectiveInference:::randomizedLASSO(X, y, lam, noise_scale, ridge_term)
23+
obj = selectiveInference:::randomizedLasso(X, y, lam, noise_scale, ridge_term)
2424
S = selectiveInference:::sample_opt_variables(obj, jump_scale=rep(1/sqrt(n), p), nsample=10000)
2525
return(S$samples[2001:10000,])
2626
}

0 commit comments

Comments
 (0)