Skip to content

Commit 9f3d177

Browse files
fixing approximate rank in SVD for ROSI
1 parent 1e690de commit 9f3d177

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

selectiveInference/R/funs.ROSI.R

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,20 +288,21 @@ approximate_BN = function(X, active_set){
288288

289289
svdX = svd(X)
290290

291-
rank = sum(svdX$d > max(svdX$d) * 1.e-9)
291+
approx_rank = sum(svdX$d > max(svdX$d) * 1.e-9)
292292
inv_d = 1. / svdX$d
293-
if (rank < length(svdX$d)) {
294-
inv_d[(rank+1):length(svdX$d)] = 0.
293+
if (approx_rank < length(svdX$d)) {
294+
inv_d[(approx_rank+1):length(svdX$d)] = 0.
295295
}
296-
inv = svdX$u %*% diag(inv_d^2) %*% t(svdX$u)
296+
inv = svdX$u[,1:approx_rank,drop=FALSE] %*% diag(inv_d[1:approx_rank]^2) %*% t(svdX$u)[1:approx_rank,,drop=FALSE]
297297

298298
D = rep(0, nactive)
299299

300300
for (i in 1:nactive){
301301
var = active_set[i]
302302
D[i] = 1/(t(X[,var]) %*% inv %*% X[,var])
303303
}
304-
pseudo_XTX = svdX$v[active_set,,drop=FALSE] %*% diag(inv_d^2) %*% t(svdX$v)
304+
305+
pseudo_XTX = svdX$v[active_set,1:approx_rank,drop=FALSE] %*% diag(inv_d[1:approx_rank]^2) %*% t(svdX$v)[1:approx_rank,,drop=FALSE]
305306

306307
M_active = diag(D) %*% pseudo_XTX # last two terms: projection onto row(X)
307308
return(M_active)

0 commit comments

Comments
 (0)