-
Notifications
You must be signed in to change notification settings - Fork 8
/
sem_inspector.py
127 lines (105 loc) · 5.13 KB
/
sem_inspector.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from pandas import DataFrame, set_option, reset_option
from sem_model import SEMModel
from sem_opt_abc import SEMOptABC
from graphviz import Digraph
from sys import stdout
from numpy.linalg import norm
def inspect(sem: SEMModel, sem_optimiser: SEMOptABC, output=stdout):
""" Outputs model's matricies with their current parameters assigned their resepctive values. """
def print_matrix(matrixName, matrix, colHeaders, rowHeaders, output):
lenX = len(rowHeaders)
lenY = len(colHeaders)
print(matrixName, file=output)
print('Shape:', matrix.shape, file=output)
print(DataFrame(matrix[:lenX, :lenY], columns=colHeaders, index=rowHeaders).round(3), file=output)
set_option('expand_frame_repr', False)
v_all = sem.d_vars['All']
v_obs = sem.d_vars['ObsEndo'] + sem.d_vars['ObsExo'] + sem.d_vars['Manifest']
v_spart = sem.d_vars['SPart']
v_mpart = sem.d_vars['MPart']
v_latent = sem.d_vars['Lat']
v_endo = sem.d_vars['LatEndo'] + sem.d_vars['ObsEndo']
v_exo = sem.d_vars['LatExo'] + sem.d_vars['ObsExo']
print('All variables:', v_all, file=output)
print('Observable variables:', v_obs, file=output)
print('Structural part:', v_spart, file=output)
print('Measurement part:', v_mpart, file=output)
print('Latent varaibles:', v_latent, file=output)
print('Endogenous variables:', v_endo, file=output)
print('Exogenous variables:', v_exo, file=output)
# if sem_optimiser.estimator == 'MLSkewed':
# print('Skewness ', sem_optimiser.add_params, file=output)
matrices = sem.get_matrices(sem_optimiser.params)
print_matrix('Beta', matrices['Beta'], v_spart, v_spart, output)
print_matrix('Lambda', matrices['Lambda'], v_spart, v_mpart, output)
print_matrix('Psi', matrices['Psi'], v_spart, v_spart, output)
print_matrix('Theta', matrices['Theta'], v_mpart, v_mpart, output)
m_cov = sem_optimiser.m_cov
if m_cov is not None:
m_sigma = sem_optimiser.calculate_sigma()
print_matrix("Empirical covariance matrix:", m_cov, v_mpart, v_mpart, output)
print_matrix("Model-implied covariance matrix:", m_sigma, v_mpart, v_mpart, output)
print("Euclidian difference between them:", norm(m_cov - m_sigma), file=output)
reset_option('expand_frame_repr')
def inspect_mx(mx_name, sem: SEMModel, sem_optimiser: SEMOptABC, output=stdout):
'''Outputs model's matricies with their current parameters assigned their resepctive values.'''
def print_matrix(matrixName, matrix, colHeaders, rowHeaders, output):
lenX = len(rowHeaders)
lenY = len(colHeaders)
print(DataFrame(matrix[:lenX, :lenY], columns=colHeaders, index=rowHeaders).round(3), file=output)
set_option('expand_frame_repr', False)
v_all = sem.d_vars['All']
v_obs = sem.d_vars['ObsEndo'] + sem.d_vars['ObsExo'] + sem.d_vars['Manifest']
v_spart = sem.d_vars['SPart']
v_mpart = sem.d_vars['MPart']
v_latent = sem.d_vars['Lat']
v_endo = sem.d_vars['LatEndo'] + sem.d_vars['ObsEndo']
v_exo = sem.d_vars['LatExo'] + sem.d_vars['ObsExo']
matrices = sem.get_matrices(sem_optimiser.params)
if mx_name == 'Beta':
print_matrix('Beta', matrices['Beta'], v_spart, v_spart, output)
elif mx_name == 'Lambda':
print_matrix('Lambda', matrices['Lambda'], v_spart, v_mpart, output)
elif mx_name == 'Psi':
print_matrix('Psi', matrices['Psi'], v_spart, v_spart, output)
elif mx_name == 'Theta':
print_matrix('Theta', matrices['Theta'], v_mpart, v_mpart, output)
#
# def semPlot(sem, labelEdges=False, covariances=False, filename=None):
# g = Digraph(engine='dot', format='jpg')
# g.edge_attr.update({'fontsize': '8'})
# sp = sem.m_model.m_vars['SPart']
# mp = sem.m_model.m_vars['MPart']
# lv = sem.m_model.m_vars['Latent']
# nlv = sorted(list(set(sp) - set(lv)) + mp)
# for v in nlv:
# g.node(v, shape='box', color='red')
# for v in mp:
# g.node(v, shape='box', color='black')
# for v in lv:
# g.node(v, shape='oval', color='red')
# for v in sem.m_model.m_model:
# for rvalue in sem.m_model.m_model[v][Operations.MEASUREMENT]:
# if labelEdges:
# val = round(sem.m_model.get_value_from_operation(Operations.MEASUREMENT, v, rvalue), 3)
# else:
# val = ''
# g.edge(v, rvalue, label=str(val))
# for rvalue in sem.m_model.m_model[v][Operations.REGRESSION]:
# if labelEdges:
# val = round(sem.m_model.get_value_from_operation(Operations.REGRESSION, v, rvalue), 3)
# else:
# val = ''
# g.edge(rvalue, v, label=str(val))
# if covariances:
# for rvalue in sem.m_model.m_model[v][Operations.COVARIANCE]:
# if labelEdges:
# val = round(sem.m_model.get_value_from_operation(Operations.COVARIANCE, v, rvalue), 3)
# else:
# val = ''
# g.edge(v, rvalue, dir='both', style='dashed', constraint='false', label=str(val))
# if filename is None:
# g.render(view=True)
# else:
# g.render(filename)
#