Coverage for nilearn/glm/tests/test_regression.py: 0%

52 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-16 12:32 +0200

1"""Test functions for models.regression.""" 

2 

3import pytest 

4from numpy.testing import ( 

5 assert_almost_equal, 

6 assert_array_almost_equal, 

7 assert_array_equal, 

8) 

9 

10from nilearn.glm import ARModel, OLSModel, SimpleRegressionResults 

11 

12 

13@pytest.fixture() 

14def X(rng): # noqa: N802 

15 return rng.standard_normal(size=(40, 10)) 

16 

17 

18@pytest.fixture() 

19def Y(rng): # noqa: N802 

20 return rng.standard_normal(size=(40, 10)) 

21 

22 

23def test_ols(X, Y): 

24 model = OLSModel(design=X) 

25 results = model.fit(Y) 

26 assert results.df_residuals == 30 

27 assert results.residuals.shape[0] == 40 

28 assert results.predicted.shape[0] == 40 

29 

30 

31def test_ar(X, Y): 

32 model = ARModel(design=X, rho=0.4) 

33 results = model.fit(Y) 

34 assert results.df_residuals == 30 

35 assert results.residuals.shape[0] == 40 

36 assert results.predicted.shape[0] == 40 

37 

38 

39def test_residuals(X, Y): 

40 # If design matrix contains an intercept, the 

41 # mean of the residuals should be 0 (short of 

42 # some numerical rounding errors) 

43 X[:, 0] = 1 

44 model = OLSModel(design=X) 

45 results = model.fit(Y) 

46 assert_almost_equal(results.residuals.mean(), 0) 

47 assert len(results.whitened_residuals) == 40 

48 

49 

50def test_predicted_r_square(X, Y): 

51 Xshort = X.copy()[:10, :] 

52 Yshort = Y.copy()[:10] 

53 

54 # Signal of 10 elements should be completely 

55 # predicted by 10 predictors (short of some numerical 

56 # rounding errors) 

57 model = OLSModel(design=Xshort) 

58 results = model.fit(Yshort) 

59 assert_almost_equal(results.residuals.sum(), 0) 

60 assert_array_almost_equal(results.predicted, Yshort) 

61 assert_almost_equal(results.r_square, 1.0) 

62 

63 

64def test_ols_degenerate(X, Y): 

65 X[:, 0] = X[:, 1] + X[:, 2] 

66 model = OLSModel(design=X) 

67 results = model.fit(Y) 

68 assert results.df_residuals == 31 

69 

70 

71def test_ar_degenerate(X, Y): 

72 X[:, 0] = X[:, 1] + X[:, 2] 

73 model = ARModel(design=X, rho=0.9) 

74 results = model.fit(Y) 

75 assert results.df_residuals == 31 

76 

77 

78def test_simple_results(X, Y): 

79 model = OLSModel(X) 

80 results = model.fit(Y) 

81 

82 simple_results = SimpleRegressionResults(results) 

83 assert_array_equal(results.predicted, simple_results.predicted(X)) 

84 assert_array_equal(results.residuals, simple_results.residuals(Y, X)) 

85 assert_array_equal( 

86 results.normalized_residuals, simple_results.normalized_residuals(Y, X) 

87 )