Skip to content

Commit 23eff06

Browse files
committed
[IV 212] Adding base classes required for bayesian instrumental variable regression
1 parent 6817574 commit 23eff06

File tree

5 files changed

+1544
-3
lines changed

5 files changed

+1544
-3
lines changed

causalpy/pymc_experiments.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,3 +856,67 @@ def _get_treatment_effect_coeff(self) -> str:
856856
return label
857857

858858
raise NameError("Unable to find coefficient name for the treatment effect")
859+
860+
861+
class InstrumentalVariable(ExperimentalDesign):
862+
"""
863+
A class to analyse instrumental variable style experiments.
864+
865+
:param instruments_data: A pandas dataframe of instruments
866+
for our treatment variable
867+
:param data: A pandas dataframe of covariates for fitting
868+
the focal regression of interest
869+
:param instruments_formula: A statistical model formula for
870+
the instrumental stage regression
871+
:param formula: A statistical model formula for the focal regression
872+
:param model: A PyMC model
873+
:param priors: An optional dictionary of priors for the
874+
mus and sigmas of both regressions
875+
876+
.. note::
877+
878+
There is no pre/post intervention data distinction for the instrumental variable
879+
design, we fit all the data available.
880+
"""
881+
882+
def __init__(
883+
self,
884+
instruments_data: pd.DataFrame,
885+
data: pd.DataFrame,
886+
instruments_formula: str,
887+
formula: str,
888+
model=None,
889+
priors=None,
890+
**kwargs,
891+
):
892+
super().__init__(model=model, **kwargs)
893+
self.expt_type = "Instrumental Variable Regression"
894+
self.data = data
895+
self.instruments_data = instruments_data
896+
self.formula = formula
897+
self.instruments_formula = instruments_formula
898+
self.model = model
899+
900+
y, X = dmatrices(formula, self.data)
901+
self._y_design_info = y.design_info
902+
self._x_design_info = X.design_info
903+
self.labels = X.design_info.column_names
904+
self.y, self.X = np.asarray(y), np.asarray(X)
905+
self.outcome_variable_name = y.design_info.column_names[0]
906+
907+
t, Z = dmatrices(instruments_formula, self.instruments_data)
908+
self._t_design_info = t.design_info
909+
self._z_design_info = Z.design_info
910+
self.labels_instruments = Z.design_info.column_names
911+
self.t, self.Z = np.asarray(t), np.asarray(Z)
912+
self.instrument_variable_name = t.design_info.column_names[0]
913+
914+
# fit the model to the observed (pre-intervention) data
915+
COORDS = {"instruments": self.labels_instruments, "covariates": self.labels}
916+
self.coords = COORDS
917+
if priors is None:
918+
priors = {"mus": [0, 0], "sigmas": [1, 1]}
919+
self.priors = priors
920+
self.model.fit(
921+
X=self.X, Z=self.Z, y=self.y, t=self.t, coords=COORDS, priors=self.priors
922+
)

causalpy/pymc_models.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import numpy as np
55
import pandas as pd
66
import pymc as pm
7+
import pytensor.tensor as pt
78
from arviz import r2_score
89

910

@@ -117,3 +118,73 @@ def build_model(self, X, y, coords):
117118
sigma = pm.HalfNormal("sigma", 1)
118119
mu = pm.Deterministic("mu", pm.math.dot(X, beta), dims="obs_ind")
119120
pm.Normal("y_hat", mu, sigma, observed=y, dims="obs_ind")
121+
122+
123+
class InstrumentalVariableRegression(ModelBuilder):
124+
"""Custom PyMC model for instrumental linear regression"""
125+
126+
def build_model(self, X, Z, y, t, coords, priors):
127+
"""Specify model with treatment regression and focal regression data and priors
128+
129+
:param X: A pandas dataframe used to predict our outcome y
130+
:param Z: A pandas dataframe used to predict our treatment variable t
131+
:param y: An array of values representing our focal outcome y
132+
:param t: An array of values representing the treatment t of
133+
which we're interested in estimating the causal impact
134+
:param coords: A dictionary with the coordinate names for our
135+
instruments and covariates
136+
:param priors: An optional dictionary of priors for the mus and
137+
sigmas of both regressions
138+
139+
e.g priors = {'mus': [[10, 0], [2, 0]], 'sigmas': [[1, 1], [1, 1]]}
140+
141+
"""
142+
143+
# --- Priors ---
144+
with self:
145+
self.add_coords(coords)
146+
beta_t = pm.Normal(
147+
name="beta_t",
148+
mu=priors["mus"][0],
149+
sigma=priors["sigmas"][0],
150+
dims="instruments",
151+
)
152+
beta_z = pm.Normal(
153+
name="beta_z",
154+
mu=priors["mus"][1],
155+
sigma=priors["sigmas"][1],
156+
dims="covariates",
157+
)
158+
sd_dist = pm.HalfCauchy.dist(beta=2, shape=2)
159+
chol, corr, sigmas = pm.LKJCholeskyCov(
160+
name="chol_cov", eta=2, n=2, sd_dist=sd_dist
161+
)
162+
# compute and store the covariance matrix
163+
pm.Deterministic(name="cov", var=pt.dot(l=chol, r=chol.T))
164+
165+
# --- Parameterization ---
166+
mu_y = pm.Deterministic(name="mu_y", var=pm.math.dot(X, beta_z))
167+
mu_t = pm.Deterministic(name="mu_t", var=pm.math.dot(Z, beta_t))
168+
mu = pm.Deterministic(name="mu", var=pt.stack(tensors=(mu_y, mu_t), axis=1))
169+
170+
# --- Likelihood ---
171+
pm.MvNormal(
172+
name="likelihood",
173+
mu=mu,
174+
chol=chol,
175+
observed=np.stack(arrays=(y.flatten(), t.flatten()), axis=1),
176+
shape=(X.shape[0], 2),
177+
)
178+
179+
def fit(self, X, Z, y, t, coords, priors):
180+
"""Draw samples from posterior, prior predictive, and posterior predictive
181+
distributions.
182+
"""
183+
self.build_model(X, Z, y, t, coords, priors)
184+
with self.model:
185+
self.idata = pm.sample(**self.sample_kwargs)
186+
self.idata.extend(pm.sample_prior_predictive())
187+
self.idata.extend(
188+
pm.sample_posterior_predictive(self.idata, progressbar=False)
189+
)
190+
return self.idata

docs/source/_static/interrogate_badge.svg

Lines changed: 3 additions & 3 deletions
Loading

docs/source/notebooks/AJR2001.txt

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
longname shortnam logmort0 risk loggdp campaign source0 slave latitude neoeuro asia africa other edes1975 campaignsj campaignsj2 mortnaval1 logmortnaval1 mortnaval2 logmortnaval2 mortjam logmortjam logmortcap250 logmortjam250 wandcafrica malfal94 wacacontested mortnaval2250 logmortnaval2250 mortnaval1250 logmortnaval1250
2+
Angola AGO 5.6347895 5.3600001 7.77 1 0 0 .1367 0 0 1 0 0 1 1 280 5.6347895 280 5.6347895 280 5.6347895 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
3+
Argentina ARG 4.232656 6.3899999 9.1300001 1 0 0 .37779999 0 0 0 0 90 1 1 15.07 2.7127061 30.5 3.4177268 56.5 4.0342407 4.232656 4.0342407 0 0 0 30.5 3.4177268 15.07 2.7127061
4+
Australia AUS 2.1459312 9.3199997 9.8999996 0 0 0 .30000001 1 0 0 1 99 0 1 8.5500002 2.1459312 8.5500002 2.1459312 8.5500002 2.1459312 2.1459312 2.1459312 0 0 0 8.5500002 2.1459312 8.5500002 2.1459312
5+
Burkina Faso BFA 5.6347895 4.4499998 6.8499999 1 0 0 .1444 0 0 1 0 0 1 1 280 5.6347895 280 5.6347895 280 5.6347895 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
6+
Bangladesh BGD 4.2684379 5.1399999 6.8800001 1 1 0 .2667 0 1 0 0 0 1 1 71.410004 4.2684379 71.410004 4.2684379 71.410004 4.2684379 4.2684379 4.2684379 0 .12008 0 71.410004 4.2684379 71.410004 4.2684379
7+
Bahamas BHS 4.4426513 7.5 9.29 0 0 0 .2683 0 0 0 0 10 0 0 85 4.4426513 85 4.4426513 85 4.4426513 4.4426513 4.4426513 0 0 85 4.4426513 85 4.4426513
8+
Bolivia BOL 4.2626801 5.6399999 7.9299998 1 0 0 .18889999 0 0 0 0 30.000002 1 1 93.25 4.535284 56.5 4.0342407 4.2626801 4.0342407 0 .00165 0 93.25 4.535284
9+
Brazil BRA 4.2626801 7.9099998 8.7299995 1 0 0 .1111 0 0 0 0 55 1 1 15.07 2.7127061 30.5 3.4177268 56.5 4.0342407 4.2626801 4.0342407 0 .035999998 0 30.5 3.4177268 15.07 2.7127061
10+
Canada CAN 2.7788193 9.7299995 9.9899998 0 1 0 .66670001 1 0 0 0 98 0 0 16.1 2.7788193 16.1 2.7788193 16.1 2.7788193 2.7788193 2.7788193 0 0 0 16.1 2.7788193 16.1 2.7788193
11+
Chile CHL 4.232656 7.8200002 9.3400002 1 0 0 .33329999 0 0 0 0 50 1 1 15.07 2.7127061 30.5 3.4177268 56.5 4.0342407 4.232656 4.0342407 0 0 0 30.5 3.4177268 15.07 2.7127061
12+
Cote d'Ivoire CIV 6.5042882 7 7.4400001 1 0 0 .0889 0 0 1 0 0 1 1 668 6.5042882 668 6.5042882 668 6.5042882 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
13+
Cameroon CMR 5.6347895 6.4499998 7.5 1 0 0 .066699997 0 0 1 0 0 1 1 280 5.6347895 280 5.6347895 280 5.6347895 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
14+
Congo COG 5.480639 4.6799998 7.4200001 0 1 1 .0111 0 0 1 0 0 0 0 240 5.480639 240 5.480639 240 5.480639 5.480639 5.480639 1 .94999999 0 240 5.480639 240 5.480639
15+
Colombia COL 4.2626801 7.3200002 8.8100004 1 0 0 .044399999 0 0 0 0 25 1 1 93.25 4.535284 56.5 4.0342407 4.2626801 4.0342407 0 .14637001 0 93.25 4.535284
16+
Costa Rica CRI 4.3579903 7.0500002 8.79 1 0 0 .1111 0 0 0 0 20 1 1 93.25 4.535284 62.200001 4.1303549 4.3579903 4.1303549 0 0 0 93.25 4.535284
17+
Dominican Re DOM 4.8675346 6.1799998 8.3599997 0 0 0 .2111 0 0 0 0 25 0 0 130 4.8675346 130 4.8675346 130 4.8675346 4.8675346 4.8675346 0 0 0 130 4.8675346 130 4.8675346
18+
Algeria DZA 4.3592696 6.5 8.3900003 1 1 0 .31110001 0 0 1 0 0 1 1 78.199997 4.3592696 78.199997 4.3592696 78.199997 4.3592696 4.3592696 4.3592696 0 0 0 78.199997 4.3592696 78.199997 4.3592696
19+
Ecuador ECU 4.2626801 6.5500002 8.4700003 1 0 0 .0222 0 0 0 0 30.000002 1 1 93.25 4.535284 56.5 4.0342407 4.2626801 4.0342407 0 .11894999 0 93.25 4.535284
20+
Egypt EGY 4.2165623 6.77 7.9499998 1 1 0 .30000001 0 0 1 0 0 1 1 67.800003 4.2165623 67.800003 4.2165623 67.800003 4.2165623 4.2165623 4.2165623 0 0 0 67.800003 4.2165623 67.800003 4.2165623
21+
Ethiopia ETH 3.2580965 5.73 6.1100001 1 1 0 .0889 0 0 1 0 0 1 1 26 3.2580965 26 3.2580965 26 3.2580965 3.2580965 3.2580965 1 .551 0 26 3.2580965 26 3.2580965
22+
Gabon GAB 5.6347895 7.8200002 8.8999996 1 0 0 .0111 0 0 1 0 0 1 1 280 5.6347895 280 5.6347895 280 5.6347895 5.521461 5.521461 1 .94050002 1 250 5.521461 250 5.521461
23+
Ghana GHA 6.5042882 6.27 7.3699999 1 1 0 .0889 0 0 1 0 0 1 1 668 6.5042882 668 6.5042882 668 6.5042882 5.521461 5.521461 1 .94999999 0 250 5.521461 250 5.521461
24+
Guinea GIN 6.1800165 6.5500002 7.4899998 1 0 0 .1222 0 0 1 0 0 1 1 483 6.1800165 483 6.1800165 483 6.1800165 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
25+
Gambia GMB 7.2930179 8.2700005 7.27 1 1 0 .1476 0 0 1 0 0 1 1 1470 7.2930179 1470 7.2930179 1470 7.2930179 5.521461 5.521461 1 .94999999 0 250 5.521461 250 5.521461
26+
Guatemala GTM 4.2626801 5.1399999 8.29 1 0 0 .17 0 0 0 0 20 1 1 93.25 4.535284 56.5 4.0342407 4.2626801 4.0342407 0 .0036000002 0 93.25 4.535284
27+
Guyana GUY 3.4713452 5.8899999 7.9000001 0 0 0 .055599999 0 0 0 0 2 0 0 32.18 3.4713452 32.18 3.4713452 32.18 3.4713452 3.4713452 3.4713452 0 .49503002 0 32.18 3.4713452 32.18 3.4713452
28+
Hong Kong HKG 2.7013612 8.1400003 10.05 0 0 0 .24609999 0 1 0 0 0 1 1 14.9 2.7013612 14.9 2.7013612 14.9 2.7013612 2.7013612 2.7013612 0 0 0 14.9 2.7013612 14.9 2.7013612
29+
Honduras HND 4.3579903 5.3200002 7.6900001 1 0 0 .16670001 0 0 0 0 20 1 1 93.25 4.535284 62.200001 4.1303549 4.3579903 4.1303549 0 .012 0 93.25 4.535284
30+
Haiti HTI 4.8675346 3.73 7.1500001 0 0 0 .2111 0 0 0 0 0 0 0 130 4.8675346 130 4.8675346 130 4.8675346 4.8675346 4.8675346 0 1 0 130 4.8675346 130 4.8675346
31+
Indonesia IDN 5.1357985 7.5900002 7.3299999 1 1 0 .055599999 0 1 0 0 0 1 1 170 5.1357985 170 5.1357985 170 5.1357985 5.1357985 5.1357985 0 .17873 0 170 5.1357985 170 5.1357985
32+
India IND 3.8842406 8.2700005 7.3299999 0 1 0 .22220001 0 1 0 0 0 0 0 48.630001 3.8842406 48.630001 3.8842406 48.630001 3.8842406 3.8842406 3.8842406 0 .23596001 0 48.630001 3.8842406 48.630001 3.8842406
33+
Jamaica JAM 4.8675346 7.0900002 8.1899996 0 1 0 .2017 0 0 0 0 10 0 1 130 4.8675346 130 4.8675346 130 4.8675346 4.8675346 4.8675346 0 0 0 130 4.8675346 130 4.8675346
34+
Kenya KEN 4.9767337 6.0500002 7.0599999 0 1 1 .0111 0 0 1 0 0 0 0 145 4.9767337 145 4.9767337 145 4.9767337 4.9767337 4.9767337 1 .79799998 0 145 4.9767337 145 4.9767337
35+
Sri Lanka LKA 4.2456341 6.0500002 7.73 0 1 0 .077799998 0 1 0 0 0 0 1 69.800003 4.2456341 69.800003 4.2456341 69.800003 4.2456341 4.2456341 4.2456341 0 .138 0 69.800003 4.2456341 69.800003 4.2456341
36+
Morocco MAR 4.3592696 7.0900002 8.04 1 0 0 .3556 0 0 1 0 1 1 1 78.199997 4.3592696 78.199997 4.3592696 78.199997 4.3592696 4.3592696 4.3592696 0 0 0 78.199997 4.3592696 78.199997 4.3592696
37+
Madagascar MDG 6.2842088 4.4499998 6.8400002 1 1 0 .22220001 0 0 1 0 0 1 1 536.03998 6.2842088 536.03998 6.2842088 536.03998 6.2842088 5.521461 5.521461 1 .94999999 0 250 5.521461 250 5.521461
38+
Mexico MEX 4.2626801 7.5 8.9399996 1 1 0 .25560001 0 0 0 0 15.000001 1 1 71 4.2626801 71 4.2626801 71 4.2626801 4.2626801 4.2626801 0 .00042 0 71 4.2626801 71 4.2626801
39+
Mali MLI 7.986165 4 6.5700002 1 1 0 .18889999 0 0 1 0 0 1 1 2940 7.986165 2940 7.986165 2940 7.986165 5.521461 5.521461 1 .94050002 0 250 5.521461 250 5.521461
40+
Malta MLT 2.7911651 7.23 9.4300003 0 1 0 .3944 0 0 0 1 100 0 0 16.299999 2.7911651 16.299999 2.7911651 16.299999 2.7911651 2.7911651 2.7911651 0 0 16.299999 2.7911651 16.299999 2.7911651
41+
Malaysia MYS 2.8735647 7.9499998 8.8900003 0 1 0 .025599999 0 1 0 0 0 0 1 17.700001 2.8735647 17.700001 2.8735647 17.700001 2.8735647 2.8735647 2.8735647 0 .23331 0 17.700001 2.8735647 17.700001 2.8735647
42+
Niger NER 5.9914646 5 6.73 1 0 0 .1778 0 0 1 0 0 1 1 400 5.9914646 400 5.9914646 400 5.9914646 5.521461 5.521461 1 .94050002 1 250 5.521461 250 5.521461
43+
Nigeria NGA 7.6029005 5.5500002 6.8099999 1 1 0 .1111 0 0 1 0 0 1 1 2004 7.6029005 2004 7.6029005 2004 7.6029005 5.521461 5.521461 1 .94999999 0 250 5.521461 250 5.521461
44+
Nicaragua NIC 5.0955892 5.23 7.54 1 0 0 .1444 0 0 0 0 20 1 1 93.25 4.535284 130 4.8675346 5.0955892 4.8675346 0 .044 0 93.25 4.535284
45+
New Zealand NZL 2.1459312 9.7299995 9.7600002 0 1 0 .45559999 1 0 0 1 91.699997 1 1 8.5500002 2.1459312 8.5500002 2.1459312 8.5500002 2.1459312 2.1459312 2.1459312 0 0 0 8.5500002 2.1459312 8.5500002 2.1459312
46+
Pakistan PAK 3.6106477 6.0500002 7.3499999 1 0 0 .33329999 0 1 0 0 0 1 1 36.990002 3.6106477 36.990002 3.6106477 36.990002 3.6106477 3.6106477 3.6106477 0 .53757 0 36.990002 3.6106477 36.990002 3.6106477
47+
Panama PAN 5.0955892 5.9099998 8.8400002 1 0 0 .1 0 0 0 0 20 1 1 15.07 2.7127061 30.5 3.4177268 130 4.8675346 5.0955892 4.8675346 0 .08004 0 30.5 3.4177268 15.07 2.7127061
48+
Peru PER 4.2626801 5.77 8.3999996 1 0 0 .1111 0 0 0 0 30.000002 1 1 15.07 2.7127061 30.5 3.4177268 56.5 4.0342407 4.2626801 4.0342407 0 .00050000002 0 30.5 3.4177268 15.07 2.7127061
49+
Paraguay PRY 4.3579903 6.9499998 8.21 1 0 0 .25560001 0 0 0 0 25 1 1 93.25 4.535284 62.200001 4.1303549 4.3579903 4.1303549 0 0 0 93.25 4.535284
50+
Sudan SDN 4.4796071 4 7.3099999 1 1 0 .16670001 0 0 1 0 0 1 1 88.199997 4.4796071 88.199997 4.4796071 88.199997 4.4796071 4.4796071 4.4796071 1 .93099999 0 88.199997 4.4796071 88.199997 4.4796071
51+
Senegal SEN 5.1038828 6 7.4000001 0 1 0 .1556 0 0 1 0 0 0 1 164.66 5.1038828 164.66 5.1038828 164.66 5.1038828 5.1038828 5.1038828 1 .94999999 0 164.66 5.1038828 164.66 5.1038828
52+
Singapore SGP 2.8735647 9.3199997 10.15 0 0 0 .0136 0 1 0 0 0 0 1 17.700001 2.8735647 17.700001 2.8735647 17.700001 2.8735647 2.8735647 2.8735647 0 0 0 17.700001 2.8735647 17.700001 2.8735647
53+
Sierra Leone SLE 6.1800165 5.8200002 6.25 1 1 0 .092200004 0 0 1 0 0 1 1 483 6.1800165 483 6.1800165 483 6.1800165 5.521461 5.521461 1 .94999999 0 250 5.521461 250 5.521461
54+
El Salvador SLV 4.3579903 5 7.9499998 1 0 0 .15000001 0 0 0 0 20 1 1 93.25 4.535284 62.200001 4.1303549 4.3579903 4.1303549 0 0 0 93.25 4.535284
55+
Togo TGO 6.5042882 6.9099998 7.2199998 1 0 0 .0889 0 0 1 0 0 1 1 668 6.5042882 668 6.5042882 668 6.5042882 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
56+
Trinidad and Tobago TTO 4.4426513 7.4499998 8.7700005 0 1 0 .1222 0 0 0 0 40 0 1 85 4.4426513 85 4.4426513 85 4.4426513 4.4426513 4.4426513 0 0 0 85 4.4426513 85 4.4426513
57+
Tunisia TUN 4.1431346 6.4499998 8.4799995 1 1 0 .37779999 0 0 1 0 0 1 1 63 4.1431346 63 4.1431346 63 4.1431346 4.1431346 4.1431346 0 0 0 63 4.1431346 63 4.1431346
58+
Tanzania TZA 4.9767337 6.6399999 6.25 0 0 1 .066699997 0 0 1 0 0 0 0 145 4.9767337 145 4.9767337 145 4.9767337 4.9767337 4.9767337 1 .92150003 1 145 4.9767337 145 4.9767337
59+
Uganda UGA 5.6347895 4.4499998 6.9699998 1 0 0 .0111 0 0 1 0 0 1 1 280 5.6347895 280 5.6347895 280 5.6347895 5.521461 5.521461 1 .94999999 1 250 5.521461 250 5.521461
60+
Uruguary URY 4.2626801 7 9.0299997 1 0 0 .36669999 0 0 0 0 90 1 1 93.25 4.535284 56.5 4.0342407 4.2626801 4.0342407 0 0 0 93.25 4.535284
61+
USA USA 2.7080503 10 10.22 0 1 0 .42219999 1 0 0 0 83.600006 0 1 15 2.7080503 15 2.7080503 15 2.7080503 2.7080503 2.7080503 0 0 0 15 2.7080503 15 2.7080503
62+
Venezuela VEN 4.3579903 7.1399999 9.0699997 1 0 0 .0889 0 0 0 0 20 1 1 93.25 4.535284 62.200001 4.1303549 4.3579903 4.1303549 0 .0070400001 0 93.25 4.535284
63+
Vietnam VNM 4.9416423 6.4099998 7.2800002 1 1 0 .1778 0 1 0 0 0 1 1 140 4.9416423 140 4.9416423 140 4.9416423 4.9416423 4.9416423 0 .70109999 0 140 4.9416423 140 4.9416423
64+
South Africa ZAF 2.74084 6.8600001 8.8900003 0 1 0 .3222 0 0 1 0 16 0 1 15.5 2.74084 15.5 2.74084 15.5 2.74084 2.74084 2.74084 0 .1045 0 15.5 2.74084 15.5 2.74084
65+
Zaire ZAR 5.480639 3.5 6.8699999 0 0 1 0 0 0 1 0 0 0 0 240 5.480639 240 5.480639 240 5.480639 5.480639 5.480639 1 .94999999 1 240 5.480639 240 5.480639

0 commit comments

Comments
 (0)