def hail_calculation(ds): rrm = hl.realized_relationship_matrix(ds['GT']) fn = utils.new_temp_file(suffix='.tsv') rrm.export_tsv(fn) data = [] with open(utils.uri_path(fn)) as f: f.readline() for line in f: row = line.strip().split() data.append(list(map(float, row))) return np.array(data)
def test_linear_mixed_model_function(self): n, f, m = 4, 2, 3 y = np.array([0.0, 1.0, 8.0, 9.0]) x = np.array([[1.0, 0.0], [1.0, 2.0], [1.0, 1.0], [1.0, 4.0]]) z = np.array([[0.0, 0.0, 1.0], [0.0, 1.0, 2.0], [1.0, 2.0, 0.0], [2.0, 0.0, 1.0]]) p_path = utils.new_temp_file() def make_call(gt): if gt == 0.0: return hl.Call([0, 0]) if gt == 1.0: return hl.Call([0, 1]) if gt == 2.0: return hl.Call([1, 1]) data = [{'v': j, 's': i, 'y': y[i], 'x1': x[i, 1], 'zt': make_call(z[i, j])} for i in range(n) for j in range(m)] ht = hl.Table.parallelize(data, hl.dtype('struct{v: int32, s: int32, y: float64, x1: float64, zt: tcall}')) mt = ht.to_matrix_table(row_key=['v'], col_key=['s'], col_fields=['x1', 'y']) colsort = np.argsort(mt.key_cols_by().s.collect()).tolist() mt = mt.choose_cols(colsort) rrm = hl.realized_relationship_matrix(mt.zt).to_numpy() # kinship path agrees with from_kinship model, p = hl.linear_mixed_model(mt.y, [1, mt.x1], k=rrm, p_path=p_path, overwrite=True) model0, p0 = LinearMixedModel.from_kinship(y, x, rrm, p_path, overwrite=True) assert model0._same(model) assert np.allclose(p0, p) # random effects path with standardize=True agrees with low-rank rrm s0, u0 = np.linalg.eigh(rrm) s0 = np.flip(s0, axis=0)[:m] p0 = np.fliplr(u0).T[:m, :] model, p = hl.linear_mixed_model(mt.y, [1, mt.x1], z_t=mt.zt.n_alt_alleles(), p_path=p_path, overwrite=True) model0 = LinearMixedModel(p0 @ y, p0 @ x, s0, y, x, p_path=p_path) assert model0._same(model) # random effects path with standardize=False agrees with from_random_effects model0, p0 = LinearMixedModel.from_random_effects(y, x, z, p_path, overwrite=True) model, p = hl.linear_mixed_model(mt.y, [1, mt.x1], z_t=mt.zt.n_alt_alleles(), p_path=p_path, overwrite=True, standardize=False) assert model0._same(model) assert np.allclose(p0, p.to_numpy())
def test_linear_mixed_model_function(self): n, f, m = 4, 2, 3 y = np.array([0.0, 1.0, 8.0, 9.0]) x = np.array([[1.0, 0.0], [1.0, 2.0], [1.0, 1.0], [1.0, 4.0]]) z = np.array([[0.0, 0.0, 1.0], [0.0, 1.0, 2.0], [1.0, 2.0, 0.0], [2.0, 0.0, 1.0]]) p_path = utils.new_temp_file() def make_call(gt): if gt == 0.0: return hl.Call([0, 0]) if gt == 1.0: return hl.Call([0, 1]) if gt == 2.0: return hl.Call([1, 1]) data = [{ 'v': j, 's': i, 'y': y[i], 'x1': x[i, 1], 'zt': make_call(z[i, j]) } for i in range(n) for j in range(m)] ht = hl.Table.parallelize( data, hl.dtype( 'struct{v: int32, s: int32, y: float64, x1: float64, zt: tcall}' )) mt = ht.to_matrix_table(row_key=['v'], col_key=['s'], col_fields=['x1', 'y']) colsort = np.argsort(mt.key_cols_by().s.collect()).tolist() mt = mt.choose_cols(colsort) rrm = hl.realized_relationship_matrix(mt.zt).to_numpy() # kinship path agrees with from_kinship model, p = hl.linear_mixed_model(mt.y, [1, mt.x1], k=rrm, p_path=p_path, overwrite=True) model0, p0 = LinearMixedModel.from_kinship(y, x, rrm, p_path, overwrite=True) assert model0._same(model) assert np.allclose(p0, p) # random effects path with standardize=True agrees with low-rank rrm s0, u0 = np.linalg.eigh(rrm) s0 = np.flip(s0, axis=0)[:m] p0 = np.fliplr(u0).T[:m, :] model, p = hl.linear_mixed_model(mt.y, [1, mt.x1], z_t=mt.zt.n_alt_alleles(), p_path=p_path, overwrite=True) model0 = LinearMixedModel(p0 @ y, p0 @ x, s0, y, x, p_path=p_path) assert model0._same(model) # random effects path with standardize=False agrees with from_random_effects model0, p0 = LinearMixedModel.from_random_effects(y, x, z, p_path, overwrite=True) model, p = hl.linear_mixed_model(mt.y, [1, mt.x1], z_t=mt.zt.n_alt_alleles(), p_path=p_path, overwrite=True, standardize=False) assert model0._same(model) assert np.allclose(p0, p.to_numpy())