Linear mixed effects

from bayes_window import models, BayesWindow, LMERegression
from bayes_window.generative_models import generate_fake_spikes, generate_fake_lfp
import numpy as np
df, df_monster, index_cols, _ = generate_fake_lfp(mouse_response_slope=8,
                                                 n_trials=40)

LFP

Without data overlay

bw = LMERegression(df=df, y='Log power', treatment='stim', group='mouse')
bw.fit(add_data=False)
bw.plot().display()
Using formula Log_power ~  C(stim, Treatment) + (1 | mouse)
                          Coef.    Std.Err.       z  P>|z|       [0.025  \
Intercept                 0.030                                           
C(stim, Treatment)[T.1]   0.088       0.021   4.162  0.000        0.047   
1 | mouse                -0.173  165065.177  -0.000  1.000  -323521.975   
Group Var                 0.000                                           

                             0.975]  
Intercept                            
C(stim, Treatment)[T.1]       0.130  
1 | mouse                323521.629  
Group Var                            
changing x to :Q
changing x to :Q
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/base/model.py:566: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/regression/mixed_linear_model.py:2200: ConvergenceWarning: Retrying MixedLM optimization with lbfgs
  warnings.warn(
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/regression/mixed_linear_model.py:2237: ConvergenceWarning: The MLE may be on the boundary of the parameter space.
  warnings.warn(msg, ConvergenceWarning)
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/regression/mixed_linear_model.py:2261: ConvergenceWarning: The Hessian matrix at the estimated parameter values is not positive definite.
  warnings.warn(msg, ConvergenceWarning)
bw.data_and_posterior
index center interval Std.Err. z p higher interval lower interval zero
0 C(stim, Treatment)[T.1] 0.088 0.021 4.162 0.0 0.047 0.13 0

With data overlay

bw = LMERegression(df=df, y='Log power', treatment='stim', group='mouse')
try:
    bw.fit(add_data=True, do_make_change='subtract');
    bw.plot()    
except NotImplementedError:
    print('\n Data addition to LME is not implemented')
Using formula Log_power ~  C(stim, Treatment) + (1 | mouse)
                          Coef.    Std.Err.       z  P>|z|       [0.025  \
Intercept                 0.030                                           
C(stim, Treatment)[T.1]   0.088       0.021   4.162  0.000        0.047   
1 | mouse                -0.173  165065.177  -0.000  1.000  -323521.975   
Group Var                 0.000                                           

                             0.975]  
Intercept                            
C(stim, Treatment)[T.1]       0.130  
1 | mouse                323521.629  
Group Var                            

 Data addition to LME is not implemented
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/base/model.py:566: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/regression/mixed_linear_model.py:2200: ConvergenceWarning: Retrying MixedLM optimization with lbfgs
  warnings.warn(
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/regression/mixed_linear_model.py:2237: ConvergenceWarning: The MLE may be on the boundary of the parameter space.
  warnings.warn(msg, ConvergenceWarning)
/home/m/anaconda3/envs/dj/lib/python3.8/site-packages/statsmodels/regression/mixed_linear_model.py:2261: ConvergenceWarning: The Hessian matrix at the estimated parameter values is not positive definite.
  warnings.warn(msg, ConvergenceWarning)

Spikes

df, df_monster, index_cols, firing_rates = generate_fake_spikes(n_trials=20,
                                                                n_neurons=6,
                                                                n_mice=3,
                                                                dur=5,
                                                               mouse_response_slope=40,
                                                               overall_stim_response_strength=5)
df['log_isi']=np.log10(df['isi'])
bw = LMERegression(df=df, y='log_isi', treatment='stim', condition=['neuron_x_mouse'], group='mouse',)
bw.fit(add_data=False,add_group_intercept=True, add_group_slope=False);
Using formula log_isi ~ (1|mouse) + stim| neuron_x_mouse__0 + stim|neuron_x_mouse__1 + stim|neuron_x_mouse__2 + stim|neuron_x_mouse__3 + stim|neuron_x_mouse__4 + stim|neuron_x_mouse__5 + stim|neuron_x_mouse__6 + stim|neuron_x_mouse__7 + stim|neuron_x_mouse__8 + stim|neuron_x_mouse__9 + stim|neuron_x_mouse__10 + stim|neuron_x_mouse__11 + stim|neuron_x_mouse__12 + stim|neuron_x_mouse__13 + stim|neuron_x_mouse__14 + stim|neuron_x_mouse__15 + stim|neuron_x_mouse__16 + stim|neuron_x_mouse__17
                            Coef. Std.Err.        z  P>|z|  [0.025  0.975]
Intercept                  -1.047    0.132   -7.947  0.000  -1.305  -0.789
1 | mouse                  -0.079    0.069   -1.143  0.253  -0.213   0.056
stim | neuron_x_mouse__0   -0.010    0.020   -0.486  0.627  -0.049   0.030
stim | neuron_x_mouse__1   -0.074    0.020   -3.692  0.000  -0.114  -0.035
stim | neuron_x_mouse__2   -0.091    0.020   -4.506  0.000  -0.130  -0.051
stim | neuron_x_mouse__3   -0.159    0.020   -7.887  0.000  -0.198  -0.119
stim | neuron_x_mouse__4   -0.226    0.020  -11.249  0.000  -0.266  -0.187
stim | neuron_x_mouse__5   -0.276    0.020  -13.728  0.000  -0.316  -0.237
stim | neuron_x_mouse__6    0.124    0.020    6.166  0.000   0.085   0.164
stim | neuron_x_mouse__7    0.080    0.020    3.988  0.000   0.041   0.120
stim | neuron_x_mouse__8    0.019    0.020    0.967  0.334  -0.020   0.059
stim | neuron_x_mouse__9   -0.003    0.020   -0.126  0.900  -0.042   0.037
stim | neuron_x_mouse__10  -0.045    0.020   -2.213  0.027  -0.084  -0.005
stim | neuron_x_mouse__11  -0.078    0.020   -3.873  0.000  -0.117  -0.039
stim | neuron_x_mouse__12   0.194    0.020    9.641  0.000   0.155   0.233
stim | neuron_x_mouse__13   0.175    0.020    8.707  0.000   0.136   0.215
stim | neuron_x_mouse__14   0.129    0.020    6.409  0.000   0.090   0.168
stim | neuron_x_mouse__15   0.079    0.020    3.914  0.000   0.039   0.118
stim | neuron_x_mouse__16   0.012    0.020    0.576  0.565  -0.028   0.051
stim | neuron_x_mouse__17  -0.021    0.020   -1.027  0.304  -0.060   0.019
Group Var                   0.013    0.203                                
changing x to :Q
bw.chart

Group slope

bw = LMERegression(df=df, y='log_isi', treatment='stim', condition=['neuron_x_mouse'], group='mouse',)
bw.fit(add_data=False,add_group_intercept=True, add_group_slope=True)
Using formula log_isi ~ (stim|mouse)  + stim| neuron_x_mouse__0 + stim|neuron_x_mouse__1 + stim|neuron_x_mouse__2 + stim|neuron_x_mouse__3 + stim|neuron_x_mouse__4 + stim|neuron_x_mouse__5 + stim|neuron_x_mouse__6 + stim|neuron_x_mouse__7 + stim|neuron_x_mouse__8 + stim|neuron_x_mouse__9 + stim|neuron_x_mouse__10 + stim|neuron_x_mouse__11 + stim|neuron_x_mouse__12 + stim|neuron_x_mouse__13 + stim|neuron_x_mouse__14 + stim|neuron_x_mouse__15 + stim|neuron_x_mouse__16 + stim|neuron_x_mouse__17
                            Coef. Std.Err.        z  P>|z|  [0.025  0.975]
Intercept                  -1.102    0.093  -11.904  0.000  -1.284  -0.921
stim | mouse               -0.079    0.069   -1.143  0.253  -0.213   0.056
stim | neuron_x_mouse__0   -0.033    0.029   -1.146  0.252  -0.089   0.023
stim | neuron_x_mouse__1   -0.097    0.029   -3.395  0.001  -0.154  -0.041
stim | neuron_x_mouse__2   -0.114    0.029   -3.966  0.000  -0.170  -0.058
stim | neuron_x_mouse__3   -0.182    0.029   -6.337  0.000  -0.238  -0.126
stim | neuron_x_mouse__4   -0.250    0.029   -8.695  0.000  -0.306  -0.193
stim | neuron_x_mouse__5   -0.299    0.029  -10.434  0.000  -0.356  -0.243
stim | neuron_x_mouse__6    0.180    0.052    3.432  0.001   0.077   0.282
stim | neuron_x_mouse__7    0.136    0.052    2.594  0.009   0.033   0.238
stim | neuron_x_mouse__8    0.075    0.052    1.432  0.152  -0.028   0.178
stim | neuron_x_mouse__9    0.053    0.052    1.012  0.311  -0.050   0.156
stim | neuron_x_mouse__10   0.011    0.052    0.209  0.834  -0.092   0.114
stim | neuron_x_mouse__11  -0.022    0.052   -0.429  0.668  -0.125   0.080
stim | neuron_x_mouse__12   0.171    0.028    6.060  0.000   0.116   0.226
stim | neuron_x_mouse__13   0.152    0.028    5.393  0.000   0.097   0.207
stim | neuron_x_mouse__14   0.106    0.028    3.754  0.000   0.051   0.161
stim | neuron_x_mouse__15   0.056    0.028    1.973  0.049   0.000   0.111
stim | neuron_x_mouse__16  -0.012    0.028   -0.409  0.682  -0.067   0.044
stim | neuron_x_mouse__17  -0.044    0.028   -1.553  0.120  -0.099   0.011
Group Var                   0.013    0.203                                
changing x to :Q
<bayes_window.lme.LMERegression at 0x7fb304ab6760>
bw.chart
bw.plot(x='neuron_x_mouse:O').display()
changing x to neuron_x_mouse:Q

Categorical

bw.fit(formula='log_isi ~ (1|mouse) + C(stim| neuron_x_mouse)')
Using formula log_isi ~ (1|mouse) + C(stim| neuron_x_mouse)
                                 Coef.    Std.Err.       z  P>|z|  \
Intercept                       -0.768  153525.798  -0.000  1.000   
C(stim | neuron_x_mouse)[T.1]   -0.086       0.029  -3.015  0.003   
C(stim | neuron_x_mouse)[T.2]   -0.081       0.035  -2.302  0.021   
C(stim | neuron_x_mouse)[T.3]   -0.156       0.029  -5.427  0.000   
C(stim | neuron_x_mouse)[T.4]   -0.217       0.035  -6.164  0.000   
C(stim | neuron_x_mouse)[T.5]   -0.237       0.029  -8.242  0.000   
C(stim | neuron_x_mouse)[T.6]   -0.024       0.161  -0.151  0.880   
C(stim | neuron_x_mouse)[T.7]   -0.294       0.160  -1.840  0.066   
C(stim | neuron_x_mouse)[T.8]   -0.129       0.161  -0.800  0.423   
C(stim | neuron_x_mouse)[T.9]   -0.255       0.160  -1.599  0.110   
C(stim | neuron_x_mouse)[T.10]  -0.193       0.161  -1.198  0.231   
C(stim | neuron_x_mouse)[T.11]  -0.236       0.160  -1.475  0.140   
C(stim | neuron_x_mouse)[T.12]   0.543  307051.595   0.000  1.000   
C(stim | neuron_x_mouse)[T.13]   0.186  307051.595   0.000  1.000   
C(stim | neuron_x_mouse)[T.14]   0.478  307051.595   0.000  1.000   
C(stim | neuron_x_mouse)[T.15]   0.281  307051.595   0.000  1.000   
C(stim | neuron_x_mouse)[T.16]   0.361  307051.595   0.000  1.000   
C(stim | neuron_x_mouse)[T.17]   0.320  307051.595   0.000  1.000   
1 | mouse                       -0.288  153525.798  -0.000  1.000   
Group Var                        0.012       2.932                  

                                     [0.025      0.975]  
Intercept                       -300905.802  300904.266  
C(stim | neuron_x_mouse)[T.1]        -0.143      -0.030  
C(stim | neuron_x_mouse)[T.2]        -0.150      -0.012  
C(stim | neuron_x_mouse)[T.3]        -0.212      -0.099  
C(stim | neuron_x_mouse)[T.4]        -0.286      -0.148  
C(stim | neuron_x_mouse)[T.5]        -0.293      -0.180  
C(stim | neuron_x_mouse)[T.6]        -0.340       0.291  
C(stim | neuron_x_mouse)[T.7]        -0.607       0.019  
C(stim | neuron_x_mouse)[T.8]        -0.445       0.187  
C(stim | neuron_x_mouse)[T.9]        -0.569       0.058  
C(stim | neuron_x_mouse)[T.10]       -0.509       0.123  
C(stim | neuron_x_mouse)[T.11]       -0.549       0.077  
C(stim | neuron_x_mouse)[T.12]  -601809.525  601810.611  
C(stim | neuron_x_mouse)[T.13]  -601809.883  601810.254  
C(stim | neuron_x_mouse)[T.14]  -601809.590  601810.546  
C(stim | neuron_x_mouse)[T.15]  -601809.788  601810.349  
C(stim | neuron_x_mouse)[T.16]  -601809.708  601810.429  
C(stim | neuron_x_mouse)[T.17]  -601809.749  601810.388  
1 | mouse                       -300905.322  300904.746  
Group Var                                                
changing x to :Q
<bayes_window.lme.LMERegression at 0x7fb304ab6760>
bw.plot(x='neuron_x_mouse:O').display()
changing x to neuron_x_mouse:Q

Nested

bw = LMERegression(df=df, y='log_isi', treatment='stim', condition=['neuron_x_mouse'], group='mouse',)
try:
    bw.fit(add_data=False,add_group_intercept=True, add_group_slope=True, add_nested_group=True)
except Exception as e:
    print(e)
Using formula log_isi ~ (stim|mouse) + stim| neuron_x_mouse__0:mouse + stim|neuron_x_mouse__1:mouse + stim|neuron_x_mouse__2:mouse + stim|neuron_x_mouse__3:mouse + stim|neuron_x_mouse__4:mouse + stim|neuron_x_mouse__5:mouse + stim|neuron_x_mouse__6:mouse + stim|neuron_x_mouse__7:mouse + stim|neuron_x_mouse__8:mouse + stim|neuron_x_mouse__9:mouse + stim|neuron_x_mouse__10:mouse + stim|neuron_x_mouse__11:mouse + stim|neuron_x_mouse__12:mouse + stim|neuron_x_mouse__13:mouse + stim|neuron_x_mouse__14:mouse + stim|neuron_x_mouse__15:mouse + stim|neuron_x_mouse__16:mouse + stim|neuron_x_mouse__17:mouse
Singular matrix