def get_Sigma(corstr, p, k, rho): if corstr == 'exch': print("Exchangeable covariance matrix") Sigma = gen.get_exch(p, rho) elif corstr == '2block': print("Using '2block' covariance matrix") Sigma = gen.get_2block(p, k, rho) elif corstr == 'ar1': print("Using AR covariance") Sigma = gen.get_ar(p, rho) else: print("Unknown corstr, using exchangeable") Sigma = gen.get_exch(p, rho) return Sigma
def sim_wrank(N, p, k, rho, corstr, FDR, offset, nW, nsim_x, nsim_yx, nsim_uyx, wtype, toCSV=True, tag=''): if corstr == 'ar1': Sigma = gen.get_ar(p, rho) else: Sigma = gen.get_exch(p, rho) SigmaChol = np.linalg.cholesky(Sigma) beta = gen.rand_beta_flat(p, k, es) fdp = gen.get_fdpfunc(beta) tpr = gen.get_tprfunc(beta) fname = "wrank-" + tag + "-nx" + str(nsim_x) + "-nyx" + str(nsim_yx) fname += "-nuyx" + str(nsim_uyx) fname += '-N' + str(N) + '-p' + str(p) fname += '-w' + wtype + '-nW' + str(nW) + '-ar1-rho' + str( rho) + '-off' + str(offset) fname += '.csv' rslt = [] vheader = [ 'k', 'N', 'p', 'rho', 'offset', 'nW', 'jx', 'jyx', 'juyx', 'FDR', 'fdp', 'tpr' ] vheader.extend(["sel{:d}".format(i) for i in range(p)]) vfmt = [ '%d', '%d', '%d', '%.3f', '%d', '%d', '%d', '%d', '%d', '%.3f', '%.18e', '%.18e' ] vfmt.extend(['%d' for i in range(p)]) vheader = ','.join(vheader) gparm = [k, N, p, rho, offset] for jx in range(nsim_x): X = gen.gen_X(N, p, SigmaChol) # scaled and centere Qx, Rx = np.linalg.qr(X, mode='reduced') G = np.matmul(Rx.T, Rx) svec = ko.get_svec_ldet(G) Ginv = np.linalg.inv(G) Cmat = ko.get_cmat(X, svec, Ginv=Ginv) for jyx in range(nsim_yx): Y = gen.gen_Y(X, N, beta, sigma=1) for juyx in range(nsim_uyx): sel_consensus = ko.doKnockoff(X, Y, FDR, offset, svec=svec, wstat=wtype, scale=False, center=False, Utilde=None, nrep=nW, Qx=Qx, Rx=Rx, Ginv=Ginv, G=G, Cmat=Cmat) sel_one = ko.doKnockoff(X, Y, FDR, offset, svec=svec, wstat=wtype, scale=False, center=False, Utilde=None, nrep=1, Qx=Qx, Rx=Rx, Ginv=Ginv, G=G, Cmat=Cmat) r1 = gparm + [ 1, jx, jyx, juyx, FDR, fdp(sel_one), tpr(sel_one) ] r1.extend((1 * sel_one).tolist()) rc = gparm + [ nW, jx, jyx, juyx, FDR, fdp(sel_consensus), tpr(sel_consensus) ] rc.extend((1 * sel_consensus).tolist()) rslt.append(r1) rslt.append(rc) rslt = np.array(rslt) if toCSV: np.savetxt(fname, rslt, fmt=vfmt, delimiter=',', header=vheader, comments='') return rslt else: return rslt, vheader, vfmt, fname
def power_method(A, p, niter=10): ek = np.random.normal(size=(p, )) ek = ek / np.linalg.norm(ek) for _ in range(niter): ek1 = np.dot(A, ek) ek1_norm = np.linalg.norm(ek1) ek = ek1 / ek1_norm return np.dot(np.dot(ek.T, A), ek) if __name__ == "__main__": p = 200 rho = 0.9 print("p={:d}".format(p)) print("correlation = {:.2f}".format(rho)) Sigma = gen.get_exch(p, rho) n = 5000 print("n={:d}".format(n)) SigmaChol = np.linalg.cholesky(Sigma) np.random.seed(1) X = gen.gen_X(n, p, SigmaChol) # scaled and centered G = np.dot(X.T, X) meig_exact = scipy.linalg.eigvalsh(G, eigvals=(0, 0))[0] print("meig_exact = " + str(meig_exact)) Ginv = scipy.linalg.inv(G) power_rslt = [] test_iter = np.arange(50) + 1 print("power iterations: ") for niter in test_iter: cv = 1 / power_method(Ginv, p, niter) power_rslt.append(cv)