@@ -48,15 +48,17 @@ def build_model(self, X, y, coords) -> None:
48
48
49
49
Example
50
50
-------
51
+ >>> import pymc as pm
52
+ >>> from causalpy.pymc_models import ModelBuilder
51
53
>>> class CausalPyModel(ModelBuilder):
52
- >>> def build_model(self, X, y):
53
- >>> with self:
54
- >>> X_ = pm.MutableData(name="X", value=X)
55
- >>> y_ = pm.MutableData(name="y", value=y)
56
- >>> beta = pm.Normal("beta", mu=0, sigma=1, shape=X_.shape[1])
57
- >>> sigma = pm.HalfNormal("sigma", sigma=1)
58
- >>> mu = pm.Deterministic("mu", pm.math.dot(X_, beta))
59
- >>> pm.Normal("y_hat", mu=mu, sigma=sigma, observed=y_)
54
+ ... def build_model(self, X, y):
55
+ ... with self:
56
+ ... X_ = pm.MutableData(name="X", value=X)
57
+ ... y_ = pm.MutableData(name="y", value=y)
58
+ ... beta = pm.Normal("beta", mu=0, sigma=1, shape=X_.shape[1])
59
+ ... sigma = pm.HalfNormal("sigma", sigma=1)
60
+ ... mu = pm.Deterministic("mu", pm.math.dot(X_, beta))
61
+ ... pm.Normal("y_hat", mu=mu, sigma=sigma, observed=y_)
60
62
"""
61
63
raise NotImplementedError ("This method must be implemented by a subclass" )
62
64
@@ -83,37 +85,22 @@ def fit(self, X, y, coords: Optional[Dict[str, Any]] = None) -> None:
83
85
>>> import pymc as pm
84
86
>>> from causalpy.pymc_models import ModelBuilder
85
87
>>> class MyToyModel(ModelBuilder):
86
- ... def build_model(self, X, y, coords):
87
- ... with self:
88
- ... X_ = pm.MutableData(name="X", value=X)
89
- ... y_ = pm.MutableData(name="y", value=y)
90
- ... beta = pm.Normal("beta", mu=0, sigma=1, shape=X_.shape[1])
91
- ... sigma = pm.HalfNormal("sigma", sigma=1)
92
- ... mu = pm.Deterministic("mu", pm.math.dot(X_, beta))
93
- ... pm.Normal("y_hat", mu=mu, sigma=sigma, observed=y_)
88
+ ... def build_model(self, X, y, coords):
89
+ ... with self:
90
+ ... X_ = pm.MutableData(name="X", value=X)
91
+ ... y_ = pm.MutableData(name="y", value=y)
92
+ ... beta = pm.Normal("beta", mu=0, sigma=1, shape=X_.shape[1])
93
+ ... sigma = pm.HalfNormal("sigma", sigma=1)
94
+ ... mu = pm.Deterministic("mu", pm.math.dot(X_, beta))
95
+ ... pm.Normal("y_hat", mu=mu, sigma=sigma, observed=y_)
94
96
>>> rng = np.random.default_rng(seed=42)
95
97
>>> X = rng.normal(loc=0, scale=1, size=(20, 2))
96
98
>>> y = rng.normal(loc=0, scale=1, size=(20,))
97
- >>> model = MyToyModel(sample_kwargs={"chains": 2, "draws": 2})
98
- >>> model.fit(X, y)
99
- Only 2 samples in chain.
100
- Auto-assigning NUTS sampler...
101
- Initializing NUTS using jitter+adapt_diag...
102
- Multiprocess sampling (2 chains in 4 jobs)
103
- NUTS: [beta, sigma]
104
- Sampling 2 chains for 1_000 tune and 2 draw iterations (2_000 + 4 draws total)
105
- took 0 seconds.gences]
106
- The number of samples is too small to check convergence reliably.
107
- Sampling: [beta, sigma, y_hat]
108
- Sampling: [y_hat]
109
- Inference data with groups:
110
- > posterior
111
- > posterior_predictive
112
- > sample_stats
113
- > prior
114
- > prior_predictive
115
- > observed_data
116
- > constant_data
99
+ >>> model = MyToyModel(
100
+ ... sample_kwargs={"chains": 2, "draws": 2, "progressbar": False}
101
+ ... )
102
+ >>> model.fit(X, y) # doctest: +ELLIPSIS
103
+ Inference ...
117
104
"""
118
105
self .build_model (X , y , coords )
119
106
with self .model :
@@ -133,16 +120,30 @@ def predict(self, X):
133
120
134
121
Example
135
122
-------
136
- Assumes `model` has been initialized and .fit() has been run,
137
- see ModelBuilder().fit() for example.
138
-
123
+ >>> import causalpy as cp
124
+ >>> import numpy as np
125
+ >>> import pymc as pm
126
+ >>> from causalpy.pymc_models import ModelBuilder
127
+ >>> class MyToyModel(ModelBuilder):
128
+ ... def build_model(self, X, y, coords):
129
+ ... with self:
130
+ ... X_ = pm.MutableData(name="X", value=X)
131
+ ... y_ = pm.MutableData(name="y", value=y)
132
+ ... beta = pm.Normal("beta", mu=0, sigma=1, shape=X_.shape[1])
133
+ ... sigma = pm.HalfNormal("sigma", sigma=1)
134
+ ... mu = pm.Deterministic("mu", pm.math.dot(X_, beta))
135
+ ... pm.Normal("y_hat", mu=mu, sigma=sigma, observed=y_)
136
+ >>> rng = np.random.default_rng(seed=42)
137
+ >>> X = rng.normal(loc=0, scale=1, size=(20, 2))
138
+ >>> y = rng.normal(loc=0, scale=1, size=(20,))
139
+ >>> model = MyToyModel(
140
+ ... sample_kwargs={"chains": 2, "draws": 2, "progressbar": False}
141
+ ... )
142
+ >>> model.fit(X, y) # doctest: +ELLIPSIS
143
+ Inference...
139
144
>>> X_new = rng.normal(loc=0, scale=1, size=(20,2))
140
- >>> model.predict(X_new)
141
- Sampling: [beta, y_hat]
142
- Inference data with groups:
143
- > posterior_predictive
144
- > observed_data
145
- > constant_data
145
+ >>> model.predict(X_new) # doctest: +ELLIPSIS
146
+ Inference...
146
147
"""
147
148
148
149
self ._data_setter (X )
@@ -162,9 +163,28 @@ def score(self, X, y) -> pd.Series:
162
163
163
164
Example
164
165
--------
165
- Assuming `model` has been fit
166
-
167
- >>> model.score(X, y) # X, y are random data here
166
+ >>> import causalpy as cp
167
+ >>> import numpy as np
168
+ >>> import pymc as pm
169
+ >>> from causalpy.pymc_models import ModelBuilder
170
+ >>> class MyToyModel(ModelBuilder):
171
+ ... def build_model(self, X, y, coords):
172
+ ... with self:
173
+ ... X_ = pm.MutableData(name="X", value=X)
174
+ ... y_ = pm.MutableData(name="y", value=y)
175
+ ... beta = pm.Normal("beta", mu=0, sigma=1, shape=X_.shape[1])
176
+ ... sigma = pm.HalfNormal("sigma", sigma=1)
177
+ ... mu = pm.Deterministic("mu", pm.math.dot(X_, beta))
178
+ ... pm.Normal("y_hat", mu=mu, sigma=sigma, observed=y_)
179
+ >>> rng = np.random.default_rng(seed=42)
180
+ >>> X = rng.normal(loc=0, scale=1, size=(20, 2))
181
+ >>> y = rng.normal(loc=0, scale=1, size=(20,))
182
+ >>> model = MyToyModel(
183
+ ... sample_kwargs={"chains": 2, "draws": 2, "progressbar": False}
184
+ ... )
185
+ >>> model.fit(X, y) # doctest: +ELLIPSIS
186
+ Inference...
187
+ >>> model.score(X, y)
168
188
Sampling: [y_hat]
169
189
r2 0.352251
170
190
r2_std 0.051624
@@ -196,27 +216,14 @@ class WeightedSumFitter(ModelBuilder):
196
216
197
217
Example
198
218
--------
219
+ >>> import causalpy as cp
220
+ >>> import numpy as np
221
+ >>> from causalpy.pymc_models import WeightedSumFitter
199
222
>>> sc = cp.load_data("sc")
200
223
>>> X = sc[['a', 'b', 'c', 'd', 'e', 'f', 'g']]
201
224
>>> y = np.asarray(sc['actual']).reshape((sc.shape[0], 1))
202
- >>> wsf = WeightedSumFitter()
203
- >>> wsf.fit(X,y)
204
- Auto-assigning NUTS sampler...
205
- Initializing NUTS using jitter+adapt_diag...
206
- Multiprocess sampling (4 chains in 4 jobs)
207
- NUTS: [beta, sigma]
208
- Sampling 4 chains for 1_000 tune and 1_000 draw iterations
209
- (4_000 + 4_000 draws total) took 3 seconds.
210
- Sampling: [beta, sigma, y_hat]
211
- Sampling: [y_hat]
212
- Inference data with groups:
213
- > posterior
214
- > posterior_predictive
215
- > sample_stats
216
- > prior
217
- > prior_predictive
218
- > observed_data
219
- > constant_data
225
+ >>> wsf = WeightedSumFitter(sample_kwargs={"progressbar": False})
226
+ >>> _ = wsf.fit(X,y)
220
227
"""
221
228
222
229
def build_model (self , X , y , coords ):
@@ -261,31 +268,19 @@ class LinearRegression(ModelBuilder):
261
268
262
269
Example
263
270
--------
271
+ >>> import causalpy as cp
272
+ >>> import numpy as np
273
+ >>> from causalpy.pymc_models import LinearRegression
264
274
>>> rd = cp.load_data("rd")
265
275
>>> X = rd[["x", "treated"]]
266
276
>>> y = np.asarray(rd["y"]).reshape((rd["y"].shape[0],1))
267
- >>> lr = LinearRegression()
277
+ >>> lr = LinearRegression(sample_kwargs={"progressbar": False} )
268
278
>>> lr.fit(X, y, coords={
269
- 'coeffs': ['x', 'treated'],
270
- 'obs_indx': np.arange(rd.shape[0])
271
- }
272
- )
273
- Auto-assigning NUTS sampler...
274
- Initializing NUTS using jitter+adapt_diag...
275
- Multiprocess sampling (4 chains in 4 jobs)
276
- NUTS: [beta, sigma]
277
- Sampling 4 chains for 1_000 tune and 1_000 draw iterations (
278
- 4_000 + 4_000 draws total) took 1 seconds.
279
- Sampling: [beta, sigma, y_hat]
280
- Sampling: [y_hat]
281
- Inference data with groups:
282
- > posterior
283
- > posterior_predictive
284
- > sample_stats
285
- > prior
286
- > prior_predictive
287
- > observed_data
288
- > constant_data
279
+ ... 'coeffs': ['x', 'treated'],
280
+ ... 'obs_indx': np.arange(rd.shape[0])
281
+ ... },
282
+ ... ) # doctest: +ELLIPSIS
283
+ Inference...
289
284
"""
290
285
291
286
def build_model (self , X , y , coords ):
0 commit comments