def test_tc(modelfile, distfile): with open(modelfile, "r") as modelfp: model = DDPModel() model.init_from(modelfp, ',') with open(distfile, "r") as distfp: dist = DistributionModel() dist.init_from(distfp, ',') output = StringIO.StringIO() dist.apply_as_distribution(model).write(output, ',') print output.getvalue() output.close()
def apply_as_distribution(self, model): if model.kind() == 'ddp_model': if len(model.xx) != len(self.yy): raise ValueError("Wrong number of values.") for ii in range(len(model.xx)): if model.get_xx()[ii] != self.get_yy()[ii]: raise ValueError("Wrong values in distribution.") vv = self.lin_p().dot(model.lin_p()) return DDPModel('ddp1', 'distribution', self.xx_is_categorical, self.get_xx(), model.yy_is_categorical, model.get_yy(), vv, scaled=self.scaled) elif model.kind() == 'spline_model': if len(model.xx) != len(self.yy): raise ValueError("Wrong number of values.") for ii in range(len(model.xx)): if model.get_xx()[ii] not in self.get_yy(): raise ValueError("Wrong values in distribution.") pp = self.lin_p() conditionals = [] for ii in range(len(self.xx)): conds = [] for jj in range(len(model.xx)): original = model.get_conditional(model.get_xx()[jj]) conditional = SplineModelConditional( original.y0s, original.y1s, original.coeffs) conditional.scale( pp[ii, self.get_yy().index(model.get_xx()[jj])]) conds.append(conditional) conditionals.append( SplineModelConditional.approximate_sum(conds)) return SplineModel(self.xx_is_categorical, self.get_xx(), conditionals, scaled=self.scaled) else: raise ValueError("Unknown model type in apply_as_distribution")
import sys, StringIO sys.path.append("../lib/models") from model import Model from ddp_model import DDPModel from spline_model import SplineModel mod1 = DDPModel.create_lin([0, 1], dict(control=[.5, .5], treatment=[0, 1])) mod2 = DDPModel.create_lin([0, 1], dict(control=[.5, .5], treatment=[1, 0])) def printmod(mod): output = StringIO.StringIO() mod.write(output, ',') print output.getvalue() printmod(Model.combine([mod1, mod2], [.5, .5])) printmod(Model.combine([mod1, mod2], [.25, 2])) mod1 = SplineModel.create_gaussian(dict(control=(0, 1), treatment=(1, 1e-3))) mod2 = SplineModel.create_gaussian(dict(control=(0, 1), treatment=(0, 1e-3))) def printmod2(mod): output = StringIO.StringIO() mod.write_gaussian_plus(output, ',') print output.getvalue() printmod2(Model.combine([mod1, mod2], [.5, .5])) printmod2(Model.combine([mod1, mod2], [.25, 2]))
model = BinModel(newmodels[0].get_xx(), allmodel) return model # Both models are BinModels @staticmethod def combine(one, two): if not one.scaled or not two.scaled: raise ValueError("Cannot combine unscaled models") (one, two, xx) = UnivariateModel.intersect_x(one, two) allxx = set(one.xx) | set(two.xx) allxx = np.array(allxx) midpts = (allxx[1:] + allxx[:-1]) / 2 onemodel = one.model.recategorize_x(map(model.get_bin_at, midpts), range(1, len(allxx))) twomodel = two.model.recategorize_x(map(model.get_bin_at, midpts), range(1, len(allxx))) model = Model.combine([onemodel, twomodel], [1, 1]) return BinModel(allxx, model, True) from ddp_model import DDPModel Model.mergers["bin_model"] = BinModel.merge Model.mergers["bin_model+ddp_model"] = lambda models: DDPModel.merge(map(lambda m: m.to_ddp(), models)) Model.mergers["bin_model+spline_model"] = lambda models: DDPModel.merge(map(lambda m: m.to_ddp(), models)) Model.combiners['bin_model+bin_model'] = BinModel.combine Model.combiners["bin_model+ddp_model"] = lambda one, two: DDPModel.combine(one.to_ddp(), two) Model.combiners["bin_model+spline_model"] = lambda one, two: DDPModel.combine(one.to_ddp(), two)
if not one.scaled or not two.scaled: raise ValueError("Cannot combine unscaled models") (one, two, xx) = UnivariateModel.intersect_x(one, two) allxx = set(one.xx) | set(two.xx) allxx = np.array(allxx) midpts = (allxx[1:] + allxx[:-1]) / 2 onemodel = one.model.recategorize_x(map(model.get_bin_at, midpts), range(1, len(allxx))) twomodel = two.model.recategorize_x(map(model.get_bin_at, midpts), range(1, len(allxx))) model = Model.combine([onemodel, twomodel], [1, 1]) return BinModel(allxx, model, True) from ddp_model import DDPModel Model.mergers["bin_model"] = BinModel.merge Model.mergers["bin_model+ddp_model"] = lambda models: DDPModel.merge( map(lambda m: m.to_ddp(), models)) Model.mergers["bin_model+spline_model"] = lambda models: DDPModel.merge( map(lambda m: m.to_ddp(), models)) Model.combiners['bin_model+bin_model'] = BinModel.combine Model.combiners["bin_model+ddp_model"] = lambda one, two: DDPModel.combine( one.to_ddp(), two) Model.combiners["bin_model+spline_model"] = lambda one, two: DDPModel.combine( one.to_ddp(), two)
import sys, StringIO sys.path.append("../lib/models") from model import Model from ddp_model import DDPModel from spline_model import SplineModel mod1 = DDPModel.create_lin([0, 1], dict(control=[.5, .5], treatment=[0, 1])) mod2 = DDPModel.create_lin([0, 1], dict(control=[.5, .5], treatment=[1, 0])) def printmod(mod): output = StringIO.StringIO() mod.write(output, ',') print output.getvalue() printmod(Model.combine([mod1, mod2], [.5, .5])) printmod(Model.combine([mod1, mod2], [.25, 2])) mod1 = SplineModel.create_gaussian(dict(control=(0, 1), treatment=(1, 1e-3))) mod2 = SplineModel.create_gaussian(dict(control=(0, 1), treatment=(0, 1e-3))) def printmod2(mod): output = StringIO.StringIO() mod.write_gaussian_plus(output, ',') print output.getvalue() printmod2(Model.combine([mod1, mod2], [.5, .5]))