diff --git a/.gitignore b/.gitignore
index ddd329e6..7f1258d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -96,4 +96,13 @@ tests/cli_test/*
docs/autoapi/*
docs/_build/*
-docs
\ No newline at end of file
+docs
+tests/cli_test_parallel_kfold/temp/be_te_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/be_tr_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/fcon1000
+tests/cli_test_parallel_kfold/temp/X_te_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/X_tr_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/X_var_te_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/X_var_tr_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/Y_te_fcon1000.pkl
+tests/cli_test_parallel_kfold/temp/Y_tr_fcon1000.pkl
diff --git a/pcntoolkit/model/hbr.py b/pcntoolkit/model/hbr.py
index 45b6fbe6..f1fc5d98 100644
--- a/pcntoolkit/model/hbr.py
+++ b/pcntoolkit/model/hbr.py
@@ -11,76 +11,22 @@
from __future__ import division
from collections import OrderedDict
-from ast import Param
-from tkinter.font import names
-
import numpy as np
import pymc as pm
import pytensor
import arviz as az
import xarray
-
from itertools import product
from functools import reduce
-
-from pymc import Metropolis, NUTS, Slice, HamiltonianMC
from scipy import stats
-import bspline
-from bspline import splinelab
from util.utils import create_poly_basis
from util.utils import expand_all
from pcntoolkit.util.utils import cartesian_product
+from pcntoolkit.util.bspline import BSplineBasis
from pcntoolkit.model.SHASH import *
-def bspline_fit(X, order, nknots):
- """
- Fit a B-spline to the data
- :param X: [N×P] array of clinical covariates
- :param order: order of the spline
- :param nknots: number of knots
- :return: a list of B-spline basis functions
- """
- feature_num = X.shape[1]
- bsp_basis = []
-
- for i in range(feature_num):
- minx = np.min(X[:, i])
- maxx = np.max(X[:, i])
- delta = maxx - minx
- # Expand range by 20% (10% on both sides)
- splinemin = minx - 0.1 * delta
- splinemax = maxx + 0.1 * delta
- knots = np.linspace(splinemin, splinemax, nknots)
- k = splinelab.augknt(knots, order)
- bsp_basis.append(bspline.Bspline(k, order))
-
- return bsp_basis
-
-
-def bspline_transform(X, bsp_basis):
- """
- Transform the data using the B-spline basis functions
- :param X: [N×P] array of clinical covariates
- :param bsp_basis: a list of B-spline basis functions
- :return: a [N×(P×nknots)] array of transformed data
- """
-
- if type(bsp_basis) != list:
- temp = []
- temp.append(bsp_basis)
- bsp_basis = temp
-
- feature_num = len(bsp_basis)
- X_transformed = []
- for f in range(feature_num):
- X_transformed.append(np.array([bsp_basis[f](i) for i in X[:, f]]))
- X_transformed = np.concatenate(X_transformed, axis=1)
-
- return X_transformed
-
-
def create_poly_basis(X, order):
"""
Create a polynomial basis expansion of the specified order
@@ -99,7 +45,7 @@ def create_poly_basis(X, order):
return Phi
-def from_posterior(param, samples, shape, distribution=None, half=False, freedom=1):
+def from_posterior(param, samples, shape, distribution=None, dims=None, half=False, freedom=1):
"""
Create a PyMC distribution from posterior samples
@@ -107,10 +53,13 @@ def from_posterior(param, samples, shape, distribution=None, half=False, freedo
:param samples: samples from the posterior
:param shape: shape of the parameter
:param distribution: distribution to use for the parameter
+ :param dims: dims of the parameter
:param half: if true, the distribution is assumed to be defined on the positive real line
:param freedom: freedom parameter for the distribution
:return: a PyMC distribution
"""
+ if dims == []:
+ dims = None
if distribution is None:
smin, smax = np.min(samples), np.max(samples)
width = smax - smin
@@ -126,25 +75,25 @@ def from_posterior(param, samples, shape, distribution=None, half=False, freedo
if shape is None:
return pm.distributions.Interpolated(param, x, y)
else:
- return pm.distributions.Interpolated(param, x, y, shape=shape)
+ return pm.distributions.Interpolated(param, x, y, shape=shape, dims=dims)
elif distribution == "normal":
temp = stats.norm.fit(samples)
if shape is None:
return pm.Normal(param, mu=temp[0], sigma=freedom * temp[1])
else:
- return pm.Normal(param, mu=temp[0], sigma=freedom * temp[1], shape=shape)
+ return pm.Normal(param, mu=temp[0], sigma=freedom * temp[1], shape=shape, dims=dims)
elif distribution == "hnormal":
temp = stats.halfnorm.fit(samples)
if shape is None:
return pm.HalfNormal(param, sigma=freedom * temp[1])
else:
- return pm.HalfNormal(param, sigma=freedom * temp[1], shape=shape)
+ return pm.HalfNormal(param, sigma=freedom * temp[1], shape=shape, dims=dims)
elif distribution == "hcauchy":
temp = stats.halfcauchy.fit(samples)
if shape is None:
return pm.HalfCauchy(param, freedom * temp[1])
else:
- return pm.HalfCauchy(param, freedom * temp[1], shape=shape)
+ return pm.HalfCauchy(param, freedom * temp[1], shape=shape, dims=dims)
elif distribution == "uniform":
upper_bound = np.percentile(samples, 95)
lower_bound = np.percentile(samples, 5)
@@ -159,6 +108,7 @@ def from_posterior(param, samples, shape, distribution=None, half=False, freedo
lower=lower_bound - freedom * r,
upper=upper_bound + freedom * r,
shape=shape,
+ dims=dims,
)
elif distribution == "huniform":
upper_bound = np.percentile(samples, 95)
@@ -168,7 +118,7 @@ def from_posterior(param, samples, shape, distribution=None, half=False, freedo
return pm.Uniform(param, lower=0, upper=upper_bound + freedom * r)
else:
return pm.Uniform(
- param, lower=0, upper=upper_bound + freedom * r, shape=shape
+ param, lower=0, upper=upper_bound + freedom * r, shape=shape, dims=dims
)
elif distribution == "gamma":
@@ -183,6 +133,7 @@ def from_posterior(param, samples, shape, distribution=None, half=False, freedo
alpha=freedom * alpha_fit,
beta=freedom / invbeta_fit,
shape=shape,
+ dims=dims,
)
elif distribution == "igamma":
@@ -193,7 +144,7 @@ def from_posterior(param, samples, shape, distribution=None, half=False, freedo
)
else:
return pm.InverseGamma(
- param, alpha=freedom * alpha_fit, beta=freedom * beta_fit, shape=shape
+ param, alpha=freedom * alpha_fit, beta=freedom * beta_fit, shape=shape, dims=dims
)
@@ -392,20 +343,29 @@ def get_modeler(self):
"""
return hbr
- def transform_X(self, X):
+ def transform_X(self, X, adapt=False):
"""
Transform the covariates according to the model type
:param X: N-by-P input matrix of P features for N subjects
:return: transformed covariates
+ :adapt: Set to true when range adaptation for bspline is needed (for example in the
+ transfer scenario)
"""
if self.model_type == "polynomial":
Phi = create_poly_basis(X, self.configs["order"])
elif self.model_type == "bspline":
if self.bsp is None:
- self.bsp = bspline_fit(
- X, self.configs["order"], self.configs["nknots"])
- bspline = bspline_transform(X, self.bsp)
+ self.bsp = BSplineBasis(order=self.configs["order"],
+ nknots=self.configs["nknots"])
+ self.bsp.fit(X)
+ #self.bsp = bspline_fit(
+ # X, self.configs["order"], self.configs["nknots"])
+ elif adapt:
+ self.bsp.adapt(X)
+
+ bspline = self.bsp.transform(X)
+ #bspline = bspline_transform(X, self.bsp)
Phi = np.concatenate((X, bspline), axis=1)
else:
Phi = X
@@ -447,6 +407,10 @@ def estimate(self, X, y, batch_effects, **kwargs):
:return: idata. The results are also stored in the instance variable `self.idata`.
"""
X, y, batch_effects = expand_all(X, y, batch_effects)
+
+ self.batch_effects_num = batch_effects.shape[1]
+ self.batch_effects_size = [len(np.unique(batch_effects[:,i])) for i in range(self.batch_effects_num)]
+
X = self.transform_X(X)
modeler = self.get_modeler()
if hasattr(self, 'idata'):
@@ -538,7 +502,7 @@ def predict(
trace=self.idata,
extend_inferencedata=True,
progressbar=True,
- var_names=var_names,
+ var_names=var_names
)
pred_mean = self.idata.posterior_predictive["y_like"].to_numpy().mean(
axis=(0, 1))
@@ -547,12 +511,12 @@ def predict(
return pred_mean, pred_var
- def estimate_on_new_site(self, X, y, batch_effects):
+ def transfer(self, X, y, batch_effects):
+
"""
- Estimate the model parameters using the provided data for a new site.
-
- This function transforms the input data, then uses the modeler to estimate the model parameters.
- The results are stored in the instance variable `idata`.
+ This function is used to transfer a reference model (i.e. the source model that is estimated on source big datasets)
+ to data from new sites (i.e. target data). It uses the posterior
+ of the reference model as a prior for the target model.
:param X: Covariates. This is the input data for the model.
:param y: Outputs. This is the target data for the model.
@@ -560,7 +524,12 @@ def estimate_on_new_site(self, X, y, batch_effects):
:return: An inferencedata object containing samples from the posterior distribution.
"""
X, y, batch_effects = expand_all(X, y, batch_effects)
- X = self.transform_X(X)
+
+ self.batch_effects_num = batch_effects.shape[1]
+ self.batch_effects_size = [len(np.unique(batch_effects[:,i])) for i in range(self.batch_effects_num)]
+
+
+ X = self.transform_X(X, adapt=True)
modeler = self.get_modeler()
with modeler(X, y, batch_effects, self.configs, idata=self.idata) as m:
self.idata = pm.sample(
@@ -573,34 +542,30 @@ def estimate_on_new_site(self, X, y, batch_effects):
cores=self.configs["cores"],
nuts_sampler=self.configs["nuts_sampler"],
)
- return self.idata
-
- def predict_on_new_site(self, X, batch_effects):
- """
- Make predictions from the model for a new site.
-
- This function transforms the input data, then uses the modeler to make predictions.
- The results are stored in the instance variable `idata`.
+
+ self.vars_to_sample = ['y_like']
+
+ # This part is for data privacy
+ if self.configs['remove_datapoints_from_posterior']:
+ chain = self.idata.posterior.coords['chain'].data
+ draw = self.idata.posterior.coords['draw'].data
+ for j in self.idata.posterior.variables.mapping.keys():
+ if j.endswith('_samples'):
+ dummy_array = xarray.DataArray(data=np.zeros((len(chain), len(draw), 1)), coords={
+ 'chain': chain, 'draw': draw, 'empty': np.array([0])}, name=j)
+ self.idata.posterior[j] = dummy_array
+ self.vars_to_sample.append(j)
- :param X: Covariates. This is the input data for the model.
- :param batch_effects: Batch effects corresponding to X. This represents the batch effects to be considered in the model.
- :return: A tuple containing the mean and variance of the predictions. The results are also stored in the instance variable `self.idata`.
- """
- X, batch_effects = expand_all(X, batch_effects)
- samples = self.configs["n_samples"]
- y = np.zeros([X.shape[0], 1])
- X = self.transform_X(X)
- modeler = self.get_modeler()
- with modeler(X, y, batch_effects, self.configs, idata=self.idata):
- self.idata = pm.sample_posterior_predictive(
- self.idata, extend_inferencedata=True, progressbar=True, var_names=self.vars_to_sample
- )
- pred_mean = self.idata.posterior_predictive["y_like"].mean(axis=(0, 1))
- pred_var = self.idata.posterior_predictive["y_like"].var(axis=(0, 1))
+ # zero-out all data
+ for i in self.idata.constant_data.data_vars:
+ self.idata.constant_data[i] *= 0
+ for i in self.idata.observed_data.data_vars:
+ self.idata.observed_data[i] *= 0
+
+ return self.idata
- return pred_mean, pred_var
- def generate(self, X, batch_effects, samples):
+ def generate(self, X, batch_effects, samples, batch_effects_maps, var_names=None):
"""
Generate samples from the posterior predictive distribution.
@@ -612,18 +577,41 @@ def generate(self, X, batch_effects, samples):
:return: A tuple containing the expanded and repeated X, batch_effects, and the generated samples.
"""
X, batch_effects = expand_all(X, batch_effects)
-
+
y = np.zeros([X.shape[0], 1])
- X = self.transform_X(X)
+ X_transformed = self.transform_X(X)
modeler = self.get_modeler()
- with modeler(X, y, batch_effects, self.configs):
- ppc = pm.sample_posterior_predictive(self.idata, progressbar=True)
- generated_samples = np.reshape(
- ppc.posterior_predictive["y_like"].squeeze().T, [
- X.shape[0] * samples, 1]
- )
- X = np.repeat(X, samples)
+
+ # See if a list of var_names is provided, set to self.vars_to_sample otherwise
+ if (var_names is None) or (var_names == ['y_like']):
+ var_names = self.vars_to_sample
+
+ # Need to delete self.idata.posterior_predictive, otherwise, if it exists, it will not be overwritten
+ if hasattr(self.idata, 'posterior_predictive'):
+ del self.idata.posterior_predictive
+
+ with modeler(X_transformed, y, batch_effects, self.configs):
+ # For each batch effect dim
+ for i in range(batch_effects.shape[1]):
+ # Make a map that maps batch effect values to their index
+ valmap = batch_effects_maps[i]
+ # Compute those indices for the test data
+ indices = list(map(lambda x: valmap[x], batch_effects[:, i]))
+ # Those indices need to be used by the model
+ pm.set_data({f"batch_effect_{i}_data": indices})
+
+ self.idata = pm.sample_posterior_predictive(
+ trace=self.idata,
+ extend_inferencedata=True,
+ progressbar=True,
+ var_names=var_names
+ )
+
+ generated_samples = np.reshape(self.idata.posterior_predictive["y_like"].to_numpy()[0,0:samples,:].T,
+ [X.shape[0] * samples, 1])
+
+ X = np.repeat(X, samples, axis=0)
if len(X.shape) == 1:
X = np.expand_dims(X, axis=1)
batch_effects = np.repeat(batch_effects, samples, axis=0)
@@ -631,6 +619,7 @@ def generate(self, X, batch_effects, samples):
batch_effects = np.expand_dims(batch_effects, axis=1)
return X, batch_effects, generated_samples
+
def sample_prior_predictive(self, X, batch_effects, samples, y=None, idata=None):
"""
Sample from the prior predictive distribution.
@@ -671,35 +660,39 @@ def get_model(self, X, y, batch_effects):
idata = self.idata if hasattr(self, "idata") else None
return modeler(X, y, batch_effects, self.configs, idata=idata)
- def create_dummy_inputs(self, covariate_ranges=[[0.1, 0.9, 0.01]]):
+ def create_dummy_inputs(self, X, step_size=0.05):
"""
- Create dummy inputs for the model.
+ Create dummy inputs for the model based on the input covariates.
- This function generates a Cartesian product of the provided covariate ranges and repeats it for each batch effect.
+ This function generates a Cartesian product of the covariate ranges determined from the input X
+ (min and max values of each covariate). It repeats this for each batch effect.
It also generates a Cartesian product of the batch effect indices and repeats it for each input sample.
- :param covariate_ranges: List of lists, where each inner list represents the range and step size of a covariate. Default is [[0.1, 0.9, 0.01]].
+ :param X: 2D numpy array, where rows are samples and columns are covariates.
+ :param step_size: Step size for generating ranges for each covariate. Default is 0.05.
:return: A tuple containing the dummy input data and the dummy batch effects.
"""
arrays = []
- for i in range(len(covariate_ranges)):
- arrays.append(
- np.arange(
- covariate_ranges[i][0],
- covariate_ranges[i][1],
- covariate_ranges[i][2],
- )
- )
- X = cartesian_product(arrays)
+ for i in range(X.shape[1]):
+ cov_min = np.min(X[:, i])
+ cov_max = np.max(X[:, i])
+ arrays.append(np.arange(cov_min, cov_max + step_size, step_size))
+
+ X_dummy = cartesian_product(arrays)
X_dummy = np.concatenate(
- [X for i in range(np.prod(self.batch_effects_size))])
+ [X_dummy for _ in range(np.prod(self.batch_effects_size))]
+ )
+
arrays = []
for i in range(self.batch_effects_num):
arrays.append(np.arange(0, self.batch_effects_size[i]))
+
batch_effects = cartesian_product(arrays)
- batch_effects_dummy = np.repeat(batch_effects, X.shape[0], axis=0)
+ batch_effects_dummy = np.repeat(batch_effects, X_dummy.shape[0] // np.prod(self.batch_effects_size), axis=0)
+
return X_dummy, batch_effects_dummy
+
def Rhats(self, var_names=None, thin=1, resolution=100):
"""
Get Rhat of posterior samples as function of sampling iteration.
@@ -796,11 +789,18 @@ def get_new_dim_size(tup):
new_shape = None
else:
new_shape = new_shape[:-1]
+
+ dims = []
+ if self.has_random_effect:
+ dims = dims + pb.batch_effect_dim_names
+ if self.name.startswith("slope") or self.name.startswith("offset_slope"):
+ dims = dims + ["basis_functions"]
self.dist = from_posterior(
param=self.name,
samples=samples.to_numpy(),
shape=new_shape,
distribution=dist,
+ dims=dims,
freedom=pb.configs["freedom"],
)
@@ -1147,7 +1147,8 @@ def get_design_matrix(X, nm, basis="linear"):
:param basis: String representing the basis to use. Default is "linear".
"""
if basis == "bspline":
- Phi = bspline_transform(X, nm.hbr.bsp)
+ Phi = nm.hbr.bsp.transform(X)
+ #Phi = bspline_transform(X, nm.hbr.bsp)
elif basis == "polynomial":
Phi = create_poly_basis(X, 3)
else:
diff --git a/pcntoolkit/normative.py b/pcntoolkit/normative.py
index af3b77e5..3b0fdc47 100755
--- a/pcntoolkit/normative.py
+++ b/pcntoolkit/normative.py
@@ -676,19 +676,14 @@ def fit(covfile, respfile, **kwargs):
if len(X.shape) == 1:
X = X[:, np.newaxis]
- # find and remove bad variables from the response variables
- # note: the covariates are assumed to have already been checked
- nz = np.where(np.bitwise_and(np.isfinite(Y).any(axis=0),
- np.var(Y, axis=0) != 0))[0]
-
scaler_resp = []
scaler_cov = []
mean_resp = [] # this is just for computing MSLL
std_resp = [] # this is just for computing MSLL
# standardize responses and covariates, ignoring invalid entries
- mY = np.mean(Y[:, nz], axis=0)
- sY = np.std(Y[:, nz], axis=0)
+ mY = np.mean(Y, axis=0)
+ sY = np.std(Y, axis=0)
mean_resp.append(mY)
std_resp.append(sY)
@@ -702,27 +697,26 @@ def fit(covfile, respfile, **kwargs):
if outscaler in ['standardize', 'minmax', 'robminmax']:
Yz = np.zeros_like(Y)
Y_scaler = scaler(outscaler)
- Yz[:, nz] = Y_scaler.fit_transform(Y[:, nz])
+ Yz= Y_scaler.fit_transform(Y)
scaler_resp.append(Y_scaler)
else:
Yz = Y
# estimate the models for all subjects
- for i in range(0, len(nz)):
- print("Estimating model ", i+1, "of", len(nz))
- nm = norm_init(Xz, Yz[:, nz[i]], alg=alg, **kwargs)
- nm = nm.estimate(Xz, Yz[:, nz[i]], **kwargs)
+ for i in range(Y.shape[1]):
+ print("Estimating model ", i+1, "of", Y.shape[1])
+ nm = norm_init(Xz, Yz[:, i], alg=alg, **kwargs)
+ nm = nm.estimate(Xz, Yz[:, i], **kwargs)
if savemodel:
- nm.save('Models/NM_' + str(0) + '_' + str(nz[i]) + outputsuffix +
+ nm.save('Models/NM_' + str(0) + '_' + str(i) + outputsuffix +
'.pkl')
if savemodel:
print('Saving model meta-data...')
v = get_package_versions()
with open('Models/meta_data.md', 'wb') as file:
- pickle.dump({'valid_voxels': nz,
- 'mean_resp': mean_resp, 'std_resp': std_resp,
+ pickle.dump({'mean_resp': mean_resp, 'std_resp': std_resp,
'scaler_cov': scaler_cov, 'scaler_resp': scaler_resp,
'regressor': alg, 'inscaler': inscaler,
'outscaler': outscaler, 'versions': v},
@@ -752,7 +746,7 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
automatically decided.
:param outputsuffix: Text string to add to the output filenames
:param batch_size: batch size (for use with normative_parallel)
- :param job_id: batch id
+ :param job_id: batch id, 'None' when non-parallel module is used.
:param fold: which cross-validation fold to use (default = 0)
:param fold: list of model IDs to predict (if not specified all are computed)
:param return_y: return the (transformed) response variable (default = False)
@@ -773,8 +767,8 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
inputsuffix = kwargs.pop('inputsuffix', 'estimate')
inputsuffix = "_" + inputsuffix.replace("_", "")
alg = kwargs.pop('alg')
- fold = kwargs.pop('fold', 0)
models = kwargs.pop('models', None)
+ fold = kwargs.pop('fold', 0)
return_y = kwargs.pop('return_y', False)
if alg == 'gpr':
@@ -805,7 +799,14 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
if batch_size is not None:
batch_size = int(batch_size)
+
+ if job_id is not None:
job_id = int(job_id) - 1
+ parallel = True
+ else:
+ parallel = False
+ job_id = 0
+
# load data
print("Loading data ...")
@@ -821,8 +822,8 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
if models is not None:
feature_num = len(models)
else:
- feature_num = len(glob.glob(os.path.join(model_path, 'NM_' + str(fold) +
- '_*' + inputsuffix + '.pkl')))
+ feature_num = len(glob.glob(os.path.join(model_path, 'NM_' + str(fold) + '_' +
+ '*' + inputsuffix + '.pkl')))
models = range(feature_num)
Yhat = np.zeros([sample_num, feature_num])
@@ -830,16 +831,15 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
Z = np.zeros([sample_num, feature_num])
if inscaler in ['standardize', 'minmax', 'robminmax']:
- Xz = scaler_cov[fold].transform(X)
+ Xz = scaler_cov[job_id].transform(X)
else:
Xz = X
if respfile is not None:
if outscaler in ['standardize', 'minmax', 'robminmax']:
- Yz = scaler_resp[fold].transform(Y)
+ Yz = scaler_resp[job_id].transform(Y)
else:
Yz = Y
- # estimate the models for all variabels
for i, m in enumerate(models):
print("Prediction by model ", i+1, "of", feature_num)
nm = norm_init(Xz)
@@ -847,18 +847,18 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
str(m) + inputsuffix + '.pkl'))
if (alg != 'hbr' or nm.configs['transferred'] == False):
yhat, s2 = nm.predict(Xz, **kwargs)
- else:
+ else: # only for hbr and in the transfer scenario
tsbefile = kwargs.get('tsbefile')
batch_effects_test = fileio.load(tsbefile)
yhat, s2 = nm.predict_on_new_sites(Xz, batch_effects_test)
if outscaler == 'standardize':
- Yhat[:, i] = scaler_resp[fold].inverse_transform(yhat, index=i)
- S2[:, i] = s2.squeeze() * sY[fold][i]**2
+ Yhat[:, i] = scaler_resp[job_id].inverse_transform(yhat, index=i)
+ S2[:, i] = s2.squeeze() * scaler_resp[job_id].s[i]**2
elif outscaler in ['minmax', 'robminmax']:
- Yhat[:, i] = scaler_resp[fold].inverse_transform(yhat, index=i)
- S2[:, i] = s2 * (scaler_resp[fold].max[i] -
- scaler_resp[fold].min[i])**2
+ Yhat[:, i] = scaler_resp[job_id].inverse_transform(yhat, index=i)
+ S2[:, i] = s2 * (scaler_resp[job_id].max[i] -
+ scaler_resp[job_id].min[i])**2
else:
Yhat[:, i] = yhat.squeeze()
S2[:, i] = s2.squeeze()
@@ -866,7 +866,9 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
if alg == 'hbr':
# Z scores for HBR must be computed independently for each model
Z[:, i] = nm.get_mcmc_zscores(Xz, Yz[:, i:i+1], **kwargs)
-
+ else:
+ Z[:, i] = np.squeeze((Yz[:, i:i+1] - Yhat[:, i:i+1]) / np.sqrt(S2[:, i:i+1]))
+
if respfile is None:
save_results(None, Yhat, S2, None, outputsuffix=outputsuffix)
@@ -875,15 +877,13 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
else:
if models is not None and len(Y.shape) > 1:
Y = Y[:, models]
+ # TODO: Needs simplification
if meta_data:
- # are we using cross-validation?
- if type(mY) is list:
- mY = mY[fold][models]
- else:
+ if type(mY) is list: # This happens when non-parallel or when using meta data from batches
+ mY = mY[0][models]
+ sY = sY[0][models]
+ else: # This happens when parallel on collected metadata
mY = mY[models]
- if type(sY) is list:
- sY = sY[fold][models]
- else:
sY = sY[models]
if len(Y.shape) == 1:
@@ -895,7 +895,7 @@ def predict(covfile, respfile, maskfile=None, **kwargs):
Yw = np.zeros_like(Y)
for i, m in enumerate(models):
nm = norm_init(Xz)
- nm = nm.load(os.path.join(model_path, 'NM_' + str(fold) + '_' +
+ nm = nm.load(os.path.join(model_path, 'NM_0_' +
str(m) + inputsuffix + '.pkl'))
warp_param = nm.blr.hyp[1:nm.blr.warp.get_n_params()+1]
@@ -937,17 +937,19 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
Basic usage::
- transfer(covfile, respfile [extra_arguments])
+ transfer(covfile, respfile, trbefile, model_path, output_path, inputsuffix [extra_arguments])
where the variables are defined below.
:param covfile: transfer covariates used to predict the response variable
:param respfile: transfer response variables for the normative model
:param maskfile: mask used to apply to the data (nifti only)
+ :param trbefile: Training batch effects file
:param testcov: Test covariates
:param testresp: Test responses
:param model_path: Directory containing the normative model and metadata
- :param trbefile: Training batch effects file
+ :param output_path: Address to output directory to save the transferred models
+ :param inputsuffix: The suffix for the inout models (default='estimate')
:param batch_size: batch size (for use with normative_parallel)
:param job_id: batch id
@@ -966,13 +968,12 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
# but should be for BLR (since it doesn't produce transfer models)
elif ('model_path' not in list(kwargs.keys())) or \
('trbefile' not in list(kwargs.keys())):
- print(f'{kwargs=}')
- print('InputError: Some general mandatory arguments are missing.')
+ print('InputError: model_path or trbefile are missing.')
return
# hbr has one additional mandatory arguments
elif alg == 'hbr':
if ('output_path' not in list(kwargs.keys())):
- print('InputError: Some mandatory arguments for hbr are missing.')
+ print('InputError: output_path is missing.')
return
else:
output_path = kwargs.pop('output_path', None)
@@ -997,7 +998,7 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
trbefile = kwargs.pop('trbefile', None)
job_id = kwargs.pop('job_id', None)
batch_size = kwargs.pop('batch_size', None)
- fold = kwargs.pop('fold', 0)
+ fold = kwargs.pop('fold', 0) # This is almost always 0 in the transfer scenario.
# for PCNonline automated parallel jobs loop
count_jobsdone = kwargs.pop('count_jobsdone', 'False')
@@ -1006,7 +1007,13 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
if batch_size is not None:
batch_size = int(batch_size)
+
+ if job_id is not None:
job_id = int(job_id) - 1
+ parallel = True
+ else:
+ parallel = False
+ job_id = 0
if not os.path.isdir(model_path):
print('Models directory does not exist!')
@@ -1036,17 +1043,28 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
X = X[:, np.newaxis]
if inscaler in ['standardize', 'minmax', 'robminmax']:
- scaler_cov[0].extend(X)
- X = scaler_cov[0].transform(X)
+ if parallel:
+ scaler_cov[job_id][fold].extend(X)
+ X = scaler_cov[job_id][fold].transform(X)
+ else:
+ scaler_cov[fold].extend(X)
+ X = scaler_cov[fold].transform(X)
+ if outscaler in ['standardize', 'minmax', 'robminmax']:
+ if parallel:
+ scaler_resp[job_id][fold].extend(Y)
+ Y = scaler_resp[job_id][fold].transform(Y)
+ else:
+ scaler_resp[fold].extend(Y)
+ Y = scaler_resp[fold].transform(Y)
+
feature_num = Y.shape[1]
+
+ # mean and std of training data only used for calculating the MSLL
mY = np.mean(Y, axis=0)
sY = np.std(Y, axis=0)
-
- if outscaler in ['standardize', 'minmax', 'robminmax']:
- scaler_resp[0].extend(Y)
- Y = scaler_resp[0].transform(Y)
-
+
+
batch_effects_train = fileio.load(trbefile)
# load test data
@@ -1056,13 +1074,23 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
if len(Xte.shape) == 1:
Xte = Xte[:, np.newaxis]
ts_sample_num = Xte.shape[0]
+
if inscaler in ['standardize', 'minmax', 'robminmax']:
- Xte = scaler_cov[0].transform(Xte)
+ if parallel:
+ Xte = scaler_cov[job_id][fold].transform(Xte)
+ else:
+ Xte = scaler_cov[fold].transform(Xte)
if testresp is not None:
Yte, testmask = load_response_vars(testresp, maskfile)
if len(Yte.shape) == 1:
Yte = Yte[:, np.newaxis]
+ if outscaler in ['standardize', 'minmax', 'robminmax']:
+ if parallel:
+ Yte = scaler_resp[job_id][fold].transform(Yte)
+ else:
+ Yte = scaler_resp[fold].transform(Yte)
+
else:
Yte = np.zeros([ts_sample_num, feature_num])
@@ -1076,10 +1104,22 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
Yhat = np.zeros([ts_sample_num, feature_num])
S2 = np.zeros([ts_sample_num, feature_num])
Z = np.zeros([ts_sample_num, feature_num])
-
+
+ if meta_data:
+ my_meta_data['mean_resp'] = mY
+ my_meta_data['std_resp'] = sY
+ if inscaler not in ['None']:
+ my_meta_data['scaler_cov'] = scaler_cov
+ if outscaler not in ['None']:
+ my_meta_data['scaler_resp'] = scaler_resp
+ if parallel:
+ pickle.dump(my_meta_data, open(os.path.join('Models', 'meta_data.md'), 'wb'))
+ else:
+ pickle.dump(my_meta_data, open(os.path.join(output_path, 'meta_data.md'), 'wb'))
+
# estimate the models for all subjects
for i in range(feature_num):
-
+
if alg == 'hbr':
print("Using HBR transform...")
nm = norm_init(X)
@@ -1092,12 +1132,9 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
print("Transferring model ", i+1, "of", feature_num)
nm = nm.load(os.path.join(model_path, 'NM_0_' + str(i) +
inputsuffix + '.pkl'))
-
- nm = nm.estimate_on_new_sites(X, Y[:, i], batch_effects_train)
- if meta_data:
- my_meta_data['scaler_cov'] = scaler_cov[0]
- my_meta_data['scaler_resp'] = scaler_resp[0]
- pickle.dump(my_meta_data, open(os.path.join(output_path, 'meta_data.md'), 'wb'))
+
+ nm = nm.transfer(X, Y[:, i], batch_effects_train)
+
if batch_size is not None:
nm.save(os.path.join(output_path, 'NM_0_' +
str(job_id*batch_size+i) + outputsuffix + '.pkl'))
@@ -1107,6 +1144,8 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
if testcov is not None:
yhat, s2 = nm.predict_on_new_sites(Xte, batch_effects_test)
+ if testresp is not None:
+ Z[:, i] = nm.get_mcmc_zscores(Xte, Yte[:, i:i+1], **kwargs)
# We basically use normative.predict script here.
if alg == 'blr':
@@ -1136,13 +1175,24 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
if testcov is not None:
if outscaler == 'standardize':
- Yhat[:, i] = scaler_resp[0].inverse_transform(
- yhat.squeeze(), index=i)
- S2[:, i] = s2.squeeze() * sY[i]**2
+ if parallel:
+ Yhat[:, i] = scaler_resp[job_id][fold].inverse_transform(
+ yhat.squeeze(), index=i)
+ S2[:, i] = s2.squeeze() * scaler_resp[job_id][fold].s[i]**2
+ else:
+ Yhat[:, i] = scaler_resp[fold].inverse_transform(
+ yhat.squeeze(), index=i)
+ S2[:, i] = s2.squeeze() * scaler_resp[fold].s[i]**2
+
elif outscaler in ['minmax', 'robminmax']:
- Yhat[:, i] = scaler_resp[0].inverse_transform(yhat, index=i)
- S2[:, i] = s2 * (scaler_resp[0].max[i] -
- scaler_resp[0].min[i])**2
+ if parallel:
+ Yhat[:, i] = scaler_resp[job_id][fold].inverse_transform(yhat, index=i)
+ S2[:, i] = s2 * (scaler_resp[job_id][fold].max[i] -
+ scaler_resp[job_id][fold].min[i])**2
+ else:
+ Yhat[:, i] = scaler_resp[fold].inverse_transform(yhat, index=i)
+ S2[:, i] = s2 * (scaler_resp[fold].max[i] -
+ scaler_resp[fold].min[i])**2
else:
Yhat[:, i] = yhat.squeeze()
S2[:, i] = s2.squeeze()
@@ -1165,9 +1215,9 @@ def transfer(covfile, respfile, testcov=None, testresp=None, maskfile=None,
Yte = Yw
else:
warp = False
-
- # TODO Z-scores adaptation for SHASH HBR
- Z = (Yte - Yhat) / np.sqrt(S2)
+ # For HBR the Z scores are already computed
+ if alg != 'hbr':
+ Z = (Yte - Yhat) / np.sqrt(S2)
print("Evaluating the model ...")
if meta_data and not warp:
@@ -1198,7 +1248,7 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
Basic usage::
- extend(covfile, respfile [extra_arguments])
+ transfer(covfile, respfile, trbefile, model_path, output_path, inputsuffix [extra_arguments])
where the variables are defined below.
@@ -1210,10 +1260,9 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
:param batch_size: batch size (for use with normative_parallel)
:param job_id: batch id
:param output_path: the path for saving the the extended model
+ :param inputsuffix: The suffix for the input models (default='extend')
:param informative_prior: use initial model prior or learn from scratch (default is False).
- :param generation_factor: see below
-
- generation factor refers to the number of samples generated for each
+ :param generation_factor: generation factor refers to the number of samples generated for each
combination of covariates and batch effects. Default is 10.
@@ -1228,7 +1277,7 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
elif ('model_path' not in list(kwargs.keys())) or \
('output_path' not in list(kwargs.keys())) or \
('trbefile' not in list(kwargs.keys())):
- print('InputError: Some mandatory arguments are missing.')
+ print('InputError: Please specify model_path, output_path, and trbefile.')
return
else:
model_path = kwargs.pop('model_path')
@@ -1237,15 +1286,25 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
outputsuffix = kwargs.pop('outputsuffix', 'extend')
outputsuffix = "_" + outputsuffix.replace("_", "")
- inputsuffix = kwargs.pop('inputsuffix', 'estimate')
+ inputsuffix = kwargs.pop('inputsuffix', 'extend')
inputsuffix = "_" + inputsuffix.replace("_", "")
informative_prior = kwargs.pop('informative_prior', 'False') == 'True'
generation_factor = int(kwargs.pop('generation_factor', '10'))
job_id = kwargs.pop('job_id', None)
batch_size = kwargs.pop('batch_size', None)
+ fold = kwargs.pop('fold', 0) # This is almost always 0 in the extend scenario.
+
+
+
if batch_size is not None:
batch_size = int(batch_size)
+
+ if job_id is not None:
job_id = int(job_id) - 1
+ parallel = True
+ else:
+ parallel = False
+ job_id = 0
if not os.path.isdir(model_path):
print('Models directory does not exist!')
@@ -1254,13 +1313,15 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
if os.path.exists(os.path.join(model_path, 'meta_data.md')):
with open(os.path.join(model_path, 'meta_data.md'), 'rb') as file:
my_meta_data = pickle.load(file)
- if (my_meta_data['inscaler'] != 'None' or
- my_meta_data['outscaler'] != 'None'):
- print('Models extention on scaled data is not possible!')
- return
+ inscaler = my_meta_data['inscaler']
+ outscaler = my_meta_data['outscaler']
+ scaler_cov = my_meta_data['scaler_cov']
+ scaler_resp = my_meta_data['scaler_resp']
meta_data = True
else:
print("No meta-data file is found!")
+ inscaler = 'None'
+ outscaler = 'None'
meta_data = False
if not os.path.isdir(output_path):
@@ -1276,13 +1337,41 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
Y = Y[:, np.newaxis]
if len(X.shape) == 1:
X = X[:, np.newaxis]
+
+ if inscaler in ['standardize', 'minmax', 'robminmax']:
+ if parallel:
+ scaler_cov[job_id][fold].extend(X)
+ X = scaler_cov[job_id][fold].transform(X)
+ else:
+ scaler_cov[fold].extend(X)
+ X = scaler_cov[fold].transform(X)
+
+ if outscaler in ['standardize', 'minmax', 'robminmax']:
+ if parallel:
+ scaler_resp[job_id][fold].extend(Y)
+ Y = scaler_resp[job_id][fold].transform(Y)
+ else:
+ scaler_resp[fold].extend(Y)
+ Y = scaler_resp[fold].transform(Y)
+
feature_num = Y.shape[1]
+ if meta_data:
+ if inscaler not in ['None']:
+ my_meta_data['scaler_cov'] = scaler_cov
+ if outscaler not in ['None']:
+ my_meta_data['scaler_resp'] = scaler_resp
+ if parallel:
+ pickle.dump(my_meta_data, open(os.path.join('Models', 'meta_data.md'), 'wb'))
+ else:
+ pickle.dump(my_meta_data, open(os.path.join(output_path, 'meta_data.md'), 'wb'))
+
+
# estimate the models for all subjects
for i in range(feature_num):
nm = norm_init(X)
- if batch_size is not None: # when using nirmative_parallel
+ if parallel: # when using normative_parallel
print("Extending model ", job_id*batch_size+i)
nm = nm.load(os.path.join(model_path, 'NM_0_' +
str(job_id*batch_size+i) + inputsuffix +
@@ -1296,7 +1385,7 @@ def extend(covfile, respfile, maskfile=None, **kwargs):
samples=generation_factor,
informative_prior=informative_prior)
- if batch_size is not None:
+ if parallel: # The model is save into both output_path and temporary parallel folders
nm.save(os.path.join(output_path, 'NM_0_' +
str(job_id*batch_size+i) + outputsuffix + '.pkl'))
nm.save(os.path.join('Models', 'NM_0_' +
diff --git a/pcntoolkit/normative_model/norm_hbr.py b/pcntoolkit/normative_model/norm_hbr.py
index 170af404..e8a9b5d0 100644
--- a/pcntoolkit/normative_model/norm_hbr.py
+++ b/pcntoolkit/normative_model/norm_hbr.py
@@ -7,26 +7,21 @@
@author: augub
"""
-from __future__ import print_function
-from __future__ import division
-from sys import exit
-
-from itertools import product
+from __future__ import division, print_function
import os
-import warnings
import sys
+from sys import exit
-import xarray
import arviz as az
import numpy as np
+import xarray
from scipy import special as spp
-from ast import literal_eval as make_tuple
try:
from pcntoolkit.dataio import fileio
- from pcntoolkit.normative_model.norm_base import NormBase
from pcntoolkit.model.hbr import HBR
+ from pcntoolkit.normative_model.norm_base import NormBase
except ImportError:
pass
@@ -111,8 +106,9 @@ class NormHBR(NormBase):
but higher values like 0.9 or 0.95 often work better for problematic posteriors.
:param order: String that defines the order of bspline or polynomial model.
The defauls is '3'.
- :param nknots: String that defines the numbers of knots for the bspline model.
- The defauls is '5'. Higher values increase the model complexity with negative
+ :param nknots: String that defines the numbers of interior knots for the bspline model.
+ The defauls is '3'. Two knots will be added to this number for boundries. So final
+ number of knots will be nknots+2. Higher values increase the model complexity with negative
effect on the spped of estimations.
:param nn_hidden_layers_num: String the specifies the number of hidden layers
in neural network model. It can be either '1' or '2'. The default is set to '2'.
@@ -158,7 +154,7 @@ def __init__(self, **kwargs):
if self.configs["type"] == "bspline":
self.configs["order"] = int(kwargs.get("order", "3"))
- self.configs["nknots"] = int(kwargs.get("nknots", "5"))
+ self.configs["nknots"] = int(kwargs.get("nknots", "3"))
elif self.configs["type"] == "polynomial":
self.configs["order"] = int(kwargs.get("order", "3"))
elif self.configs["type"] == "nn":
@@ -286,7 +282,7 @@ def estimate(self, X, y, **kwargs):
self.hbr.estimate(X, y, batch_effects_train)
return self
-
+
def predict(self, Xs, X=None, Y=None, **kwargs):
"""
Predict the target values for the given test data.
@@ -313,22 +309,22 @@ def predict(self, Xs, X=None, Y=None, **kwargs):
pred_type = self.configs["pred_type"]
- if self.configs["transferred"] == False:
- yhat, s2 = self.hbr.predict(
- X=Xs,
- batch_effects=batch_effects_test,
- batch_effects_maps=self.batch_effects_maps,
- pred=pred_type,
- **kwargs,
- )
- else:
- raise ValueError(
- "This is a transferred model. Please use predict_on_new_sites function."
- )
+ # if self.configs["transferred"] == False:
+ yhat, s2 = self.hbr.predict(
+ X=Xs,
+ batch_effects=batch_effects_test,
+ batch_effects_maps=self.batch_effects_maps,
+ pred=pred_type,
+ **kwargs,
+ )
+ # else:
+ # raise ValueError(
+ # "This is a transferred model. Please use predict_on_new_sites function."
+ # )
return yhat.squeeze(), s2.squeeze()
- def estimate_on_new_sites(self, X, y, batch_effects):
+ def transfer(self, X, y, batch_effects):
"""
Samples from the posterior of the Hierarchical Bayesian Regression model.
@@ -342,7 +338,7 @@ def estimate_on_new_sites(self, X, y, batch_effects):
- 'trbefile': File containing the batch effects for the training data. Optional.
:return: The instance of the NormHBR object.
"""
- self.hbr.estimate_on_new_site(X, y, batch_effects)
+ self.hbr.transfer(X, y, batch_effects)
self.configs["transferred"] = True
return self
@@ -357,9 +353,16 @@ def predict_on_new_sites(self, X, batch_effects):
:param batch_effects: Batch effects for the new sites.
:return: A tuple containing the predicted target values and the marginal variances for the test data on the new sites.
"""
- yhat, s2 = self.hbr.predict_on_new_site(X, batch_effects)
+
+ yhat, s2 = self.hbr.predict(
+ X,
+ batch_effects=batch_effects,
+ batch_effects_maps=self.batch_effects_maps
+ )
+
return yhat, s2
+
def extend(
self,
X,
@@ -368,7 +371,7 @@ def extend(
X_dummy_ranges=[[0.1, 0.9, 0.01]],
merge_batch_dim=0,
samples=10,
- informative_prior=False,
+ informative_prior=False
):
"""
Extend the Hierarchical Bayesian Regression model using data sampled from the posterior predictive distribution.
@@ -386,11 +389,11 @@ def extend(
:param informative_prior: Whether to use the adapt method for estimation. Default is False.
:return: The instance of the NormHBR object.
"""
- X_dummy, batch_effects_dummy = self.hbr.create_dummy_inputs(
- X_dummy_ranges)
-
+
+ X_dummy, batch_effects_dummy = self.hbr.create_dummy_inputs(X)
+
X_dummy, batch_effects_dummy, Y_dummy = self.hbr.generate(
- X_dummy, batch_effects_dummy, samples
+ X_dummy, batch_effects_dummy, samples, batch_effects_maps=self.batch_effects_maps
)
batch_effects[:, merge_batch_dim] = (
@@ -399,18 +402,20 @@ def extend(
+ 1
)
+ X = np.concatenate((X_dummy, X))
+ y = np.concatenate((Y_dummy, y))
+ batch_effects = np.concatenate((batch_effects_dummy, batch_effects))
+
+ self.batch_effects_maps = [ {v: i for i, v in enumerate(np.unique(batch_effects[:, j]))}
+ for j in range(batch_effects.shape[1])
+ ]
+
if informative_prior:
- self.hbr.adapt(
- np.concatenate((X_dummy, X)),
- np.concatenate((Y_dummy, y)),
- np.concatenate((batch_effects_dummy, batch_effects)),
- )
+ #raise NotImplementedError("The extension with informaitve prior is not implemented yet.")
+ self.hbr.transfer(X, y, batch_effects)
else:
- self.hbr.estimate(
- np.concatenate((X_dummy, X)),
- np.concatenate((Y_dummy, y)),
- np.concatenate((batch_effects_dummy, batch_effects)),
- )
+
+ self.hbr.estimate(X, y, batch_effects)
return self
@@ -522,44 +527,43 @@ def get_mcmc_quantiles(self, X, batch_effects=None, z_scores=None):
"""
# Set batch effects to zero if none are provided
if batch_effects is None:
- batch_effects = batch_effects_test = np.zeros([X.shape[0], 1])
+ batch_effects = np.zeros([X.shape[0], 1])
# Set the z_scores for which the quantiles are computed
if z_scores is None:
z_scores = np.arange(-3, 4)
- likelihood = self.configs["likelihood"]
+ elif len(z_scores.shape) == 2:
+ if not z_scores.shape[0] == X.shape[0]:
+ raise ValueError("The number of columns in z_scores must match the number of columns in X")
+ z_scores = z_scores.T
# Determine the variables to predict
- if self.configs["likelihood"] == "Normal":
- var_names = ["mu_samples", "sigma_samples", "sigma_plus_samples"]
- elif self.configs["likelihood"].startswith("SHASH"):
- var_names = [
- "mu_samples",
- "sigma_samples",
- "sigma_plus_samples",
- "epsilon_samples",
- "delta_samples",
- "delta_plus_samples",
- ]
- else:
- exit("Unknown likelihood: " + self.configs["likelihood"])
+ match self.configs["likelihood"]:
+ case "Normal":
+ var_names = ["mu_samples", "sigma_samples", "sigma_plus_samples"]
+ case "SHASHo" | "SHASHo2" | "SHASHb":
+ var_names = [
+ "mu_samples",
+ "sigma_samples",
+ "sigma_plus_samples",
+ "epsilon_samples",
+ "delta_samples",
+ "delta_plus_samples",
+ ]
+ case _:
+ exit("Unknown likelihood: " + self.configs["likelihood"])
# Delete the posterior predictive if it already exists
if "posterior_predictive" in self.hbr.idata.groups():
del self.hbr.idata.posterior_predictive
- if self.configs["transferred"] == True:
- self.predict_on_new_sites(X=X, batch_effects=batch_effects)
- # var_names = ["y_like"]
- else:
- self.hbr.predict(
- # Do a forward to get the posterior predictive in the idata
- X=X,
- batch_effects=batch_effects,
- batch_effects_maps=self.batch_effects_maps,
- pred="single",
- var_names=var_names + ["y_like"],
- )
+ self.hbr.predict(
+ X=X,
+ batch_effects=batch_effects,
+ batch_effects_maps=self.batch_effects_maps,
+ pred="single",
+ var_names=var_names + ["y_like"],
+ )
# Extract the relevant samples from the idata
post_pred = az.extract(
@@ -580,8 +584,12 @@ def get_mcmc_quantiles(self, X, batch_effects=None, z_scores=None):
(z_scores.shape[0], len_synth_data, n_mcmc_samples))
# Compute the quantile iteratively for each z-score
+
for i, j in enumerate(z_scores):
- zs = np.full((len_synth_data, n_mcmc_samples), j, dtype=float)
+ if len(z_scores.shape) == 1:
+ zs = np.full((len_synth_data, n_mcmc_samples), j, dtype=float)
+ else:
+ zs = np.repeat(j[:,None], n_mcmc_samples, axis=1)
quantiles[i] = xarray.apply_ufunc(
quantile,
*array_of_vars,
diff --git a/pcntoolkit/normative_parallel.py b/pcntoolkit/normative_parallel.py
index f1ed0e46..fce6aaf3 100755
--- a/pcntoolkit/normative_parallel.py
+++ b/pcntoolkit/normative_parallel.py
@@ -107,7 +107,8 @@ def execute_nm(processing_dir,
cv_folds = kwargs.get('cv_folds', None)
testcovfile_path = kwargs.get('testcovfile_path', None)
testrespfile_path = kwargs.get('testrespfile_path', None)
- outputsuffix = kwargs.get('outputsuffix', '_estimate')
+ outputsuffix = kwargs.get('outputsuffix', 'estimate')
+ outputsuffix = "_" + outputsuffix.replace("_", "")
cluster_spec = kwargs.pop('cluster_spec', 'torque')
log_path = kwargs.get('log_path', None)
binary = kwargs.pop('binary', False)
@@ -473,7 +474,7 @@ def collect_nm(processing_dir,
collect=False,
binary=False,
batch_size=None,
- outputsuffix='_estimate'):
+ outputsuffix='estimate'):
'''Function to checks and collects all batches.
Basic usage::
@@ -493,6 +494,8 @@ def collect_nm(processing_dir,
written by (primarily) T Wolfers, (adapted) SM Kia, (adapted) S Rutherford.
'''
+ outputsuffix = "_" + outputsuffix.replace("_", "")
+
if binary:
file_extentions = '.pkl'
else:
diff --git a/pcntoolkit/util/bspline.py b/pcntoolkit/util/bspline.py
new file mode 100644
index 00000000..b3d43f6e
--- /dev/null
+++ b/pcntoolkit/util/bspline.py
@@ -0,0 +1,149 @@
+import numpy as np
+from scipy.interpolate import BSpline
+
+
+class BSplineBasis:
+ def __init__(
+ self, order, nknots, knot_method="uniform", left_expand=0.05, right_expand=0.05
+ ):
+ """
+ Initialize the BSplineBasis object.
+ :param order: Degree of the B-spline
+ :param nknots: Number of interior knots. Mind that this is the number of interior
+ knots. The final number of knots will be nknotes+2 as two knots will be added at boundries.
+ :param knot_method: 'uniform' or 'percentile' for knot placement
+ :param left_expand: Fraction to expand the range on the left (default 0)
+ :param right_expand: Fraction to expand the range on the right (default 0)
+ """
+ if nknots + 2 < order + 1:
+ raise ValueError("Number of knots+2 must be at least degree + 1.")
+ if knot_method not in ["uniform", "percentile"]:
+ raise ValueError("knot_method must be 'uniform' or 'percentile'.")
+ if not (0 <= left_expand <= 1 and 0 <= right_expand <= 1):
+ raise ValueError("left_expand and right_expand must be between 0 and 1.")
+
+ self.degree = order
+ self.nknots = nknots
+ self.knot_method = knot_method
+ self.left_expand = left_expand
+ self.right_expand = right_expand
+ self.knots = None
+ self.feature_min = None
+ self.feature_max = None
+
+ def fit(self, X, feature_min=None, feature_max=None):
+ """
+ Fit B-spline basis functions to the dataset.
+ :param X: [N×P] array of covariates
+ :param feature_min: Minimum values for features (optional)
+ :param feature_max: Maximum values for features (optional)
+ """
+ if not isinstance(X, np.ndarray):
+ raise ValueError("Input X must be a NumPy array.")
+ if X.ndim != 2:
+ raise ValueError("Input X must be a 2D array.")
+
+ self.feature_min = (
+ np.min(X, axis=0) if feature_min is None else np.array(feature_min)
+ )
+ self.feature_max = (
+ np.max(X, axis=0) if feature_max is None else np.array(feature_max)
+ )
+
+ feature_num = X.shape[1]
+ self.knots = []
+
+ for i in range(feature_num):
+ # Determine range of bspline basis
+ minx = self.feature_min[i]
+ maxx = self.feature_max[i]
+ delta = maxx - minx
+ t_min = minx - self.left_expand * delta
+ t_max = maxx + self.right_expand * delta
+
+ # Determine knot locations
+ if self.knot_method == "uniform":
+ interior_knots = np.linspace(t_min, t_max, self.nknots)
+ elif self.knot_method == "percentile":
+ interior_knots = np.percentile(
+ X[:, i], np.linspace(0, 100, self.nknots)
+ )
+
+ # Add boundary knots
+ t = np.concatenate(
+ ([t_min] * self.degree, interior_knots, [t_max] * self.degree)
+ )
+
+ self.knots.append(t)
+
+ def transform(self, X):
+ """
+ Transform the dataset using the fitted B-spline basis functions.
+ :param X: [N×P] array of clinical covariates
+ :return: [N×(P×n_basis)] array of transformed data
+ """
+ if self.knots is None:
+ raise ValueError(
+ "B-spline basis functions have not been fitted. Call 'fit' first."
+ )
+ if not isinstance(X, np.ndarray):
+ raise ValueError("Input X must be a NumPy array.")
+ if X.ndim != 2:
+ raise ValueError("Input X must be a 2D array.")
+ if len(self.knots) != X.shape[1]:
+ raise ValueError(
+ "Number of B-spline basis functions must match the number of features in X."
+ )
+
+ transformed_features = []
+ for f in range(len(self.knots)):
+ phi = BSpline.design_matrix(
+ x=X[:, f], t=self.knots[f], k=self.degree, extrapolate=True
+ ).toarray()
+ transformed_features.append(phi)
+ return np.concatenate(transformed_features, axis=1)
+
+ def adapt(self, target_X):
+ """
+ Adapt the fitted B-spline basis functions to a target dataset.
+ :param target_X: [N×P] array of target clinical covariates
+ """
+ if self.knots is None:
+ raise ValueError(
+ "B-spline basis functions have not been fitted. Call 'fit' first."
+ )
+ if not isinstance(target_X, np.ndarray):
+ raise ValueError("Input target_X must be a NumPy array.")
+ if target_X.ndim != 2:
+ raise ValueError("Input target_X must be a 2D array.")
+ if len(self.knots) != target_X.shape[1]:
+ raise ValueError(
+ "Number of B-spline basis functions must match the number of features in target_X."
+ )
+
+ # Updating feature_min and feature_max using combined datsets
+ combined_min = np.minimum(self.feature_min, np.min(target_X, axis=0))
+ combined_max = np.maximum(self.feature_max, np.max(target_X, axis=0))
+ self.feature_min = combined_min
+ self.feature_max = combined_max
+
+ feature_num = target_X.shape[1]
+
+ new_knots = []
+
+ for i in range(feature_num):
+ minx = self.feature_min[i]
+ maxx = self.feature_max[i]
+ delta = maxx - minx
+ t_min = minx - self.left_expand * delta
+ t_max = maxx + self.right_expand * delta
+
+ # Adapt knots
+ source_knots = self.knots[i]
+ target_knots = t_min + (source_knots - source_knots[0]) * (
+ t_max - t_min
+ ) / (source_knots[-1] - source_knots[0])
+
+ new_knots.append(target_knots)
+
+ self.knots = new_knots
\ No newline at end of file
diff --git a/pcntoolkit/util/utils.py b/pcntoolkit/util/utils.py
index 3fff987f..1e3c5114 100644
--- a/pcntoolkit/util/utils.py
+++ b/pcntoolkit/util/utils.py
@@ -1515,7 +1515,7 @@ def cartesian_product(arrays):
la = len(arrays)
dtype = np.result_type(arrays[0])
arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype)
- for i, a in enumerate(np.ix_(arrays)):
+ for i, a in enumerate(np.ix_(*arrays)):
arr[..., i] = a
return arr.reshape(-1, la)
diff --git a/tests/cli_test/test_cli.sh b/tests/cli_test/test_cli.sh
index 92aa890b..163fe4bb 100755
--- a/tests/cli_test/test_cli.sh
+++ b/tests/cli_test/test_cli.sh
@@ -7,7 +7,7 @@ export tempdir="$testdir/temp"
mkdir $tempdir
chmod -R 766 $tempdir
export data_name="fcon1000"
-export model_config="-a blr warp=WarpSinArcsinh optimizer=l-bfgs-b warp_reparam=True"
+export model_config="-a blr warp=WarpSinArcsinh optimizer=l-bfgs-b warp_reparam=True inscaler=standardize"
echo "Downloading the data..."
curl -o $tempdir/$data_name https://raw.githubusercontent.com/predictive-clinical-neuroscience/PCNtoolkit-demo/refs/heads/main/data/$data_name.csv
echo "Splitting the data into train and test covariates, responses and batch effects..."
diff --git a/tests/cli_test_parallel_kfold/Yhat_estimate_ft0_batch1.png b/tests/cli_test_parallel_kfold/Yhat_estimate_ft0_batch1.png
new file mode 100644
index 00000000..44411167
Binary files /dev/null and b/tests/cli_test_parallel_kfold/Yhat_estimate_ft0_batch1.png differ
diff --git a/tests/cli_test_parallel_kfold/Yhat_estimate_ft0_batch2.png b/tests/cli_test_parallel_kfold/Yhat_estimate_ft0_batch2.png
new file mode 100644
index 00000000..44411167
Binary files /dev/null and b/tests/cli_test_parallel_kfold/Yhat_estimate_ft0_batch2.png differ
diff --git a/tests/cli_test_parallel_kfold/Yhat_estimate_ft1_batch1.png b/tests/cli_test_parallel_kfold/Yhat_estimate_ft1_batch1.png
new file mode 100644
index 00000000..7defa3ef
Binary files /dev/null and b/tests/cli_test_parallel_kfold/Yhat_estimate_ft1_batch1.png differ
diff --git a/tests/cli_test_parallel_kfold/Yhat_estimate_ft1_batch2.png b/tests/cli_test_parallel_kfold/Yhat_estimate_ft1_batch2.png
new file mode 100644
index 00000000..7defa3ef
Binary files /dev/null and b/tests/cli_test_parallel_kfold/Yhat_estimate_ft1_batch2.png differ
diff --git a/tests/cli_test_parallel_kfold/inspect_results.py b/tests/cli_test_parallel_kfold/inspect_results.py
new file mode 100644
index 00000000..f8760fff
--- /dev/null
+++ b/tests/cli_test_parallel_kfold/inspect_results.py
@@ -0,0 +1,56 @@
+import pickle
+import numpy as np
+import matplotlib.pyplot as plt
+
+import glob
+import os
+
+
+
+for batch in [1,2]:
+ results_dir = "/project/3022000.05/projects/stijdboe/temp/parallel_processing/batch_1"
+
+
+ for func in ['fit', 'predict', 'estimate']:
+ print(f"Plotting {func} results...")
+ results = glob.glob(os.path.join(results_dir, f"*{func}.pkl"))
+ for result in results:
+ if "Z" in result:
+ z = pickle.load(open(result, "rb"))
+ n = np.random.randn(z.shape[0], 1)
+ sorted_z = np.sort(z, axis=0)
+ sorted_n = np.sort(n, axis=0)
+ plt.plot(sorted_z, sorted_n, label=f"Z_{func}")
+ plt.savefig(f"Z_{func}.png")
+ plt.close()
+ elif "yhat" in result:
+ x_path = "/project/3022000.05/projects/stijdboe/Projects/PCNtoolkit/tests/cli_test_parallel_kfold/temp/X_te_fcon1000.pkl"
+ x = pickle.load(open(x_path, "rb")).to_numpy()
+ sortindex = np.argsort(x[:,1])
+ print(x[sortindex, 1])
+ yhat = pickle.load(open(result, "rb")).to_numpy()
+ result = result.replace("yhat", "ys2")
+ s2 = pickle.load(open(result, "rb")).to_numpy()
+ print(x.shape)
+ print(yhat.shape)
+ print(s2.shape)
+
+ for i in range(yhat.shape[1]):
+ plt.plot(x[sortindex, 1], yhat[sortindex, i], label=f"Yhat_{func}_{i}")
+ plt.plot(x[sortindex, 1], yhat[sortindex, i] - s2[sortindex, i], label=f"Yhat_{func}_{i} - s2")
+ plt.plot(x[sortindex, 1], yhat[sortindex, i] + s2[sortindex, i], label=f"Yhat_{func}_{i} + s2")
+ plt.savefig(f"Yhat_{func}_ft{i}_batch{batch}.png")
+ plt.close()
+ elif "S2" in result:
+ s2 = pickle.load(open(result, "rb"))
+ print(f"{s2=}")
+ elif "EXPV" in result:
+ expv = pickle.load(open(result, "rb"))
+ print(f"{expv=}")
+ elif "MSLL" in result:
+ msll = pickle.load(open(result, "rb"))
+ print(f"{msll=}")
+ elif "SMSE" in result:
+ smse = pickle.load(open(result, "rb"))
+ print(f"{smse=}")
+
diff --git a/tests/cli_test_parallel_kfold/split_data.py b/tests/cli_test_parallel_kfold/split_data.py
new file mode 100644
index 00000000..55738433
--- /dev/null
+++ b/tests/cli_test_parallel_kfold/split_data.py
@@ -0,0 +1,77 @@
+import argparse
+import os
+
+import numpy as np
+import pandas as pd
+
+# Import train_test_split from sklearn
+from sklearn.model_selection import train_test_split
+
+# Import the StandardScaler from sklearn
+from sklearn.preprocessing import StandardScaler
+
+from pcntoolkit.util.utils import create_design_matrix
+
+
+def main():
+
+ np.random.seed(42)
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--input_file", type=str, required=True)
+ parser.add_argument("--output_dir", type=str, required=True)
+ args = parser.parse_args()
+ infile=args.input_file.split("/")[-1]
+
+ print(f"Splitting the data located at {args.input_file} into train and test covariates, responses and batch effects...")
+ df = pd.read_csv(args.input_file)
+
+ # Select the covariates, responses and batch effects
+ cov = df['age']
+ resp = df[['SubCortGrayVol','Left-Hippocampus','Brain-Stem','CSF']]
+ be = df['site']
+
+ # Standardize the covariates and responses
+ cov = StandardScaler().fit_transform(cov.to_numpy()[:,np.newaxis])
+ resp = StandardScaler().fit_transform(resp.to_numpy())
+
+ xmin = cov.min()
+ xmax = cov.max()
+
+
+ # Map the batch effects to integers
+ be_ids = np.unique(be, return_inverse=True)[1]
+
+ # Split the data into training and test sets
+ train_idx, test_idx = train_test_split(np.arange(len(cov)), test_size=0.2, stratify=be_ids)
+
+ # Create the design matrices
+ mean_basis = 'linear'
+ var_basis = 'linear'
+ # Phi_tr = create_design_matrix(cov[train_idx], basis=mean_basis, intercept=False, site_ids=be_ids[train_idx])
+ # Phi_var_tr = create_design_matrix(cov[train_idx], basis=var_basis)
+ # Phi_te = create_design_matrix(cov[test_idx], basis=mean_basis, intercept=False, site_ids=be_ids[test_idx])
+ # Phi_var_te = create_design_matrix(cov[test_idx], basis=var_basis)
+
+ Phi_tr = create_design_matrix(cov[train_idx], basis=mean_basis, intercept=True, xmin=xmin, xmax=xmax)
+ # Phi_var_tr = create_design_matrix(cov[train_idx], basis=var_basis, xmin=xmin, xmax=xmax)
+ Phi_var_tr = cov[train_idx]
+ Phi_te = create_design_matrix(cov[test_idx], basis=mean_basis, intercept=True, xmin=xmin, xmax=xmax)
+ # Phi_var_te = create_design_matrix(cov[test_idx], basis=var_basis, xmin=xmin, xmax=xmax)
+ Phi_var_te = cov[test_idx]
+ print(f"{Phi_var_te.shape=}")
+
+ # Save everything
+ pd.to_pickle(pd.DataFrame(Phi_tr), os.path.join(args.output_dir, f'X_tr_{infile}.pkl'))
+ pd.to_pickle(Phi_var_tr, os.path.join(args.output_dir, f'X_var_tr_{infile}.pkl'))
+ pd.to_pickle(pd.DataFrame(Phi_te), os.path.join(args.output_dir, f'X_te_{infile}.pkl'))
+ pd.to_pickle(Phi_var_te, os.path.join(args.output_dir, f'X_var_te_{infile}.pkl'))
+ pd.to_pickle(pd.DataFrame(resp[train_idx]), os.path.join(args.output_dir, f'Y_tr_{infile}.pkl'))
+ pd.to_pickle(pd.DataFrame(resp[test_idx]), os.path.join(args.output_dir, f'Y_te_{infile}.pkl'))
+ pd.to_pickle(be[train_idx], os.path.join(args.output_dir, f'be_tr_{infile}.pkl'))
+ pd.to_pickle(be[test_idx], os.path.join(args.output_dir, f'be_te_{infile}.pkl'))
+
+ print(f"Done! The files can be found in: {args.output_dir}")
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/cli_test_parallel_kfold/submit_jobs.py b/tests/cli_test_parallel_kfold/submit_jobs.py
new file mode 100644
index 00000000..9a6b1f81
--- /dev/null
+++ b/tests/cli_test_parallel_kfold/submit_jobs.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+import sys
+
+from pcntoolkit.normative_parallel import execute_nm
+
+
+def execute_nm_wrapper(*args):
+ args_dict = {k:v for k,v in [arg.split('=') for arg in args[0]]}
+
+ func = args_dict.get('func')
+ covfile_path = args_dict.get('covfile_path',None)
+ respfile_path = args_dict.get('respfile_path',None)
+ varcovfile_path = args_dict.get('varcovfile_path',None)
+ testcovfile_path = args_dict.get('testcovfile_path',None)
+ testrespfile_path = args_dict.get('testrespfile_path',None)
+ testvarcovfile_path = args_dict.get('testvarcovfile_path',None)
+ if func == "estimate":
+ testrespfile_path = None
+
+ execute_nm(
+ python_path='/home/preclineu/stijdboe/.conda/envs/pcntk_dev/bin/python',
+ normative_path="/home/preclineu/stijdboe/.conda/envs/pcntk_dev/lib/python3.12/site-packages/pcntoolkit/normative.py",
+ job_name='test_normative_parallel',
+ processing_dir='/project/3022000.05/projects/stijdboe/temp/parallel_processing/',
+ log_path='/project/3022000.05/projects/stijdboe/temp/parallel_processing/log/',
+ varcovfile=varcovfile_path,
+ testvarcovfile=testvarcovfile_path,
+ func=func,
+ covfile_path=covfile_path,
+ respfile_path=respfile_path,
+ testcovfile_path=testcovfile_path,
+ testrespfile_path=testrespfile_path,
+ batch_size=2,
+ memory='4G',
+ duration='00:02:00',
+ job_id=1,
+ cv_folds = 5,
+ alg='blr',
+ warp='WarpSinArcsinh',
+ optimizer='l-bfgs-b',
+ warp_reparam='True',
+ binary='True',
+ cluster_spec='slurm',
+ saveoutput='True',
+ savemodel='True',
+ outputsuffix=f"_{func}"
+ )
+
+
+def main(*args):
+ execute_nm_wrapper(*args)
+
+if __name__ == "__main__":
+ main(sys.argv[1:])
diff --git a/tests/cli_test_parallel_kfold/test_cli.sh b/tests/cli_test_parallel_kfold/test_cli.sh
new file mode 100755
index 00000000..bb85ce9c
--- /dev/null
+++ b/tests/cli_test_parallel_kfold/test_cli.sh
@@ -0,0 +1,25 @@
+#! /bin/bash
+set -x
+
+# Assign the current directory to a variable
+export testdir=$(pwd)
+export tempdir="$testdir/temp"
+mkdir $tempdir
+chmod -R 766 $tempdir
+export data_name="fcon1000"
+echo "Downloading the data..."
+curl -o $tempdir/$data_name https://raw.githubusercontent.com/predictive-clinical-neuroscience/PCNtoolkit-demo/refs/heads/main/data/$data_name.csv
+echo "Splitting the data into train and test covariates, responses and batch effects..."
+python split_data.py --input_file $tempdir/$data_name --output_dir $tempdir
+
+# echo "Fitting the model..."
+# python submit_jobs.py func=fit covfile_path=$tempdir/X_tr_$data_name.pkl respfile_path=$tempdir/Y_tr_$data_name.pkl
+
+# echo "Predicting the test set..."
+# python submit_jobs.py func=predict covfile_path=$tempdir/X_te_$data_name.pkl respfile_path=$tempdir/Y_te_$data_name.pkl
+
+echo "Also doing estimate..."
+python submit_jobs.py func=estimate covfile_path=$tempdir/X_tr_$data_name.pkl respfile_path=$tempdir/Y_tr_$data_name.pkl testcovfile_path=$tempdir/X_te_$data_name.pkl testrespfile_path=$tempdir/Y_te_$data_name.pkl testvarcovfile_path=$tempdir/X_var_te_$data_name.pkl varcovfile_path=$tempdir/X_var_tr_$data_name.pkl
+
+echo "Done!"
+# rm -R $tempdirls
diff --git a/tests/testHBR.py b/tests/testHBR.py
index cd4e833e..0a337af5 100644
--- a/tests/testHBR.py
+++ b/tests/testHBR.py
@@ -27,7 +27,7 @@
random_state = 40
-working_dir = "/Users/stijndeboer/temp/HBR/" # Specify a working directory to save data and results.
+working_dir = "/Users/stijndeboer/tmp/" # Specify a working directory to save data and results.
simulation_method = "linear"
n_features = 1 # The number of input features of X
@@ -141,7 +141,7 @@
###############################################################################
-# %%
+ # %%
for j in range(n_grps):
# Showing the quantiles
diff --git a/tests/testHBR_transfer.py b/tests/testHBR_transfer.py
index 29ec9c96..42d44da2 100644
--- a/tests/testHBR_transfer.py
+++ b/tests/testHBR_transfer.py
@@ -12,14 +12,14 @@
"""
import os
+from warnings import filterwarnings
+
+import matplotlib.pyplot as plt
import numpy as np
+
+from pcntoolkit.normative import estimate
from pcntoolkit.normative_model.norm_utils import norm_init
from pcntoolkit.util.utils import simulate_data
-import matplotlib.pyplot as plt
-from pcntoolkit.normative import estimate
-from warnings import filterwarnings
-from pcntoolkit.util.utils import scaler
-import xarray
filterwarnings('ignore')
@@ -39,29 +39,29 @@
# sample numbers across different batches)
n_transfer_samples = 100
-model_types = ['linear'] # models to try
+model_types = ['bspline'] # models to try
############################## Data Simulation ################################
X_train, Y_train, grp_id_train, X_test, Y_test, grp_id_test, coef = \
simulate_data(simulation_method, n_samples, n_features, n_grps,
- working_dir=working_dir, plot=True)
+ working_dir=working_dir, plot=True, noise='heteroscedastic_gaussian')
X_train_transfer, Y_train_transfer, grp_id_train_transfer, X_test_transfer, Y_test_transfer, grp_id_test_transfer, coef = simulate_data(
- simulation_method, n_transfer_samples, n_features=n_features, n_grps=n_transfer_groups, plot=True)
+ simulation_method, n_transfer_samples, n_features=n_features, n_grps=n_transfer_groups, plot=True, noise='heteroscedastic_gaussian')
################################# Methods Tests ###############################
for model_type in model_types:
- nm = norm_init(X_train, Y_train, alg='hbr', likelihood='Normal', model_type=model_type,
- n_chains=4, cores=4, n_samples=100, n_tuning=50, freedom=5, nknots=8, target_accept="0.99", nuts_sampler='nutpie')
+ nm = norm_init(X_train, Y_train, alg='hbr', likelihood='Normal', model_type=model_type, linear_sigma="True",
+ n_chains=4, cores=4, n_samples=1500, n_tuning=500, freedom=1, nknots=8, target_accept="0.99", nuts_sampler='nutpie')
print("Now Estimating on original train data ==============================================")
nm.estimate(X_train, Y_train, trbefile=working_dir+'trbefile.pkl')
print("Now Predicting on original test data ==============================================")
- yhat, ys2 = nm.predict(X_test, tsbefile=working_dir+'tsbefile.pkl')
+ yhat, s2 = nm.predict(X_test, tsbefile=working_dir+'tsbefile.pkl')
for i in range(n_features):
sorted_idx = X_test[:, i].argsort(axis=0).squeeze()
@@ -69,7 +69,7 @@
temp_Y = Y_test[sorted_idx,]
temp_be = grp_id_test[sorted_idx, :].squeeze()
temp_yhat = yhat[sorted_idx,]
- temp_s2 = ys2[sorted_idx,]
+ temp_s2 = s2[sorted_idx,]
plt.figure()
for j in range(n_grps):
@@ -86,10 +86,10 @@
plt.show()
print("Now Estimating on transfer train data ==============================================")
- nm.estimate_on_new_sites(
+ nm.transfer(
X_train_transfer, Y_train_transfer, grp_id_train_transfer)
print("Now Predicting on transfer test data ==============================================")
- yhat, s2 = nm.predict_on_new_sites(X_test_transfer, grp_id_test_transfer)
+ yhat, s2 = nm.predict_on_new_sites(X = X_test_transfer, batch_effects = grp_id_test_transfer)
for i in range(n_features):
sorted_idx = X_test_transfer[:, i].argsort(axis=0).squeeze()
@@ -97,7 +97,7 @@
temp_Y = Y_test_transfer[sorted_idx,]
temp_be = grp_id_test_transfer[sorted_idx, :].squeeze()
temp_yhat = yhat[sorted_idx,]
- temp_s2 = ys2[sorted_idx,]
+ temp_s2 = s2[sorted_idx,]
for j in range(n_transfer_groups):
plt.scatter(temp_X[temp_be == j,], temp_Y[temp_be == j,],
diff --git a/tests/test_HBR.ipynb b/tests/test_HBR.ipynb
index 45ec901a..b17388dc 100644
--- a/tests/test_HBR.ipynb
+++ b/tests/test_HBR.ipynb
@@ -7,21 +7,26 @@
"outputs": [],
"source": [
"%matplotlib inline\n",
- "from IPython.display import clear_output, DisplayHandle\n",
+ "from IPython.display import DisplayHandle, clear_output\n",
+ "\n",
+ "\n",
"def update_patch(self, obj):\n",
" clear_output(wait=True)\n",
" self.display(obj)\n",
+ "\n",
+ "\n",
"DisplayHandle.update = update_patch\n",
- "import os\n",
+ "from warnings import filterwarnings\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
"import numpy as np\n",
+ "\n",
"from pcntoolkit.normative_model.norm_utils import norm_init\n",
"from pcntoolkit.util.utils import simulate_data\n",
- "import matplotlib.pyplot as plt\n",
- "from pcntoolkit.normative import estimate\n",
- "from warnings import filterwarnings\n",
- "filterwarnings('ignore')\n",
"\n",
- "plt.rcParams.update({'font.size': 8, 'figure.figsize': (5, 3)})\n"
+ "filterwarnings(\"ignore\")\n",
+ "\n",
+ "plt.rcParams.update({\"font.size\": 8, \"figure.figsize\": (5, 3)})\n"
]
},
{
@@ -31,7 +36,7 @@
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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d7/7HS5cuACTyYSLLroICxYsQG5urq7joiBICCEkYtFyKCGEkIhFQZAQQkjEoiBICCEkYlEQJIQQErEoCBJCCIlYFAQJIYRELAqChISoc+fOITMz063TzZIlS3DVVVeB4zi89dZb6Nu3L3r37o377rsvLBqzE6I1qhMkJIRt374djz76KA4cOICff/4ZY8eOxd69ewEAY8aMwf79+9G1a1fcfPPNmDBhAh566CGdR0yIsVAQJCTE3X///bBYLCgqKsL06dMxc+ZM/Otf/0JpaSleffVVAMC2bdswf/587NmzR+fREmIs1ECbkBD373//G7169UJOTg5mzpwJADhx4oRby7qsrCw6LokQEbQnSEiI2717N6xWK3766SfYbDa9h0NISKEgSEgIq6mpwQMPPIAPP/wQN9xwA/7yl78AAHr06IHjx487rysvL6fjkggRQXuChISw22+/HT179sT8+fNRX1+PwYMHY9myZejTpw/Gjh3rlhhz3XXX4eGHH9Z7yIQYCu0JEhKi1q9fj+LiYqxcuRIAEBcXh+XLl2PatGk4ePAg8vLyMGbMGADAlVde6dwvJIS0oZkgIYSQiEV7goQQQiIWBUFCCCERi4IgIYSQiEVBkBBCSMSiIEgIISRiURAkhBASsSgIEkIIiVgUBAkhhEQsCoKEEEIiFgVBQgghEYuCICGEkIj1/wHbCvNpLFjnXQAAAABJRU5ErkJggg==",
"text/plain": [
"
\n",
- " Sampling for an hour
\n",
+ " Sampling for 16 seconds
\n",
" \n",
" Estimated Time to Completion:\n",
" now\n",
@@ -131,9 +154,9 @@
" \n",
" \n",
"
1500 | \n",
- " 0 | \n",
- " 0.02 | \n",
- " 511 | \n",
+ " 981 | \n",
+ " 0.01 | \n",
+ " 120 | \n",
" \n",
" \n",
" \n",
@@ -142,7 +165,7 @@
"\n"
],
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -151,7 +174,7 @@
{
"data": {
"text/plain": [
- ""
+ ""
]
},
"execution_count": 4,
@@ -161,12 +184,12 @@
],
"source": [
"# Graph is constructed here\n",
- "nm.estimate(X_train, Y_train, trbefile=working_dir+'trbefile.pkl')"
+ "nm.estimate(X_train, Y_train, trbefile=working_dir + \"trbefile.pkl\")"
]
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -185,270 +208,63 @@
},
"metadata": {},
"output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
}
],
"source": [
- "yhat, ys2 = nm.predict(X_test, tsbefile=working_dir+'tsbefile.pkl')"
+ "yhat, ys2 = nm.predict(X_test, tsbefile=working_dir + \"tsbefile.pkl\")"
]
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- "\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
+ "name": "stdout",
"output_type": "stream",
"text": [
- "Sampling: [y_like]\n"
+ "(200, 7)\n"
]
},
{
"data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "
\n"
- ],
"text/plain": [
- "\n"
+ ""
]
},
+ "execution_count": 11,
"metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Sampling: [y_like]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
+ "output_type": "execute_result"
},
{
"data": {
- "text/html": [
- "\n",
- "
\n"
- ],
+ "image/png": "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",
"text/plain": [
- "\n"
+ "