Source code for brainstat.tests.datagen_f

"""Data generation for f-test unit tests."""

import pickle

import numpy as np
from sklearn.model_selection import ParameterGrid

from brainstat.stats.SLM import SLM, f_test
from brainstat.stats.terms import FixedEffect
from brainstat.tests.testutil import datadir


[docs]def generate_random_two_slms(I): slm1 = SLM(FixedEffect(1), FixedEffect(1)) slm2 = SLM(FixedEffect(1), FixedEffect(2)) for key in I.keys(): if "1" in key: setattr(slm1, key[4:], I[key]) elif "2" in key: setattr(slm2, key[4:], I[key]) return slm1, slm2
[docs]def generate_f_test_out(slm1, slm2): D = {} slm_OUT = f_test(slm1, slm2) mykeys = ["X", "df", "SSE", "coef", "k", "t"] for key in mykeys: D[key] = getattr(slm_OUT, key) return D
[docs]def params2files(I, D, test_num): """Converts params to input/output files""" basename = "xstatf" fin_name = datadir(basename + "_" + f"{test_num:02d}" + "_IN.pkl") fout_name = datadir(basename + "_" + f"{test_num:02d}" + "_OUT.pkl") with open(fin_name, "wb") as f: pickle.dump(I, f, protocol=4) with open(fout_name, "wb") as g: pickle.dump(D, g, protocol=4) return
[docs]def generate_test_data(): np.random.seed(0) a = 40 b = 30 c = 100 d = 42 e = 77 mygrid = [ { "slm1X": [np.random.randint(0, a, size=(a, b)), np.random.rand(a, b)], "slm1df": [int(a)], "slm2df": [int(b)], "slm1SSE": [ np.random.randint(1, a, size=(c, 1)), np.random.randint(1, a, size=(c, d)), ], "slm2SSE": [ np.random.randint(1, a, size=(c, 1)), np.random.randint(1, a, size=(c, d)), ], "slm1coef": [np.random.rand(e, d), np.random.rand(e, d, 3)], "slm2coef": [np.random.rand(e, d)], } ] myparamgrid = ParameterGrid(mygrid) # Here wo go! # Test 1-16 : slm1X 2D array type int or float64, slm1df and slm2df int, # slm1SSE and slm2SSE 2D arrays type int, slm1coef and slm2coef 2D or 3D # arrays type float64 test_num = 0 for params in myparamgrid: test_num += 1 I = {} for key in params.keys(): I[key] = params[key] # make "slm2X" equal to "slm1X" to avoid nested-model error I["slm2X"] = I["slm1X"] slm1, slm2 = generate_random_two_slms(I) D = generate_f_test_out(slm1, slm2) params2files(I, D, test_num)
if __name__ == "__main__": generate_test_data()