Ejemplo n.º 1
0
def oneway_banova(y,X):
    # X is a design matrix with a 1 one where factor is present
    with Model() as banova:
        sigma = Uniform('SD lowest', lower=0,upper=10)
        sd_prior = pm.Gamma('SD Prior', 1.01005, 0.1005)
        offset = Normal('offset', mu=0, tau=0.001)
        alphas = Normal('alphas', mu=0.0, sd=sd_prior, shape=X.shape[0])
        betas = alphas - alphas.mean()
        betas = Deterministic('betas', betas)

        data = Normal('data', mu= offset + Tns.dot(X.T, betas),
                sd=sigma, observed=y)
    return banova
Ejemplo n.º 2
0
def appc_gamma_model(
        y,
        observer,
        ambiguity_regressor,
        context,
        observed=True):
    '''
    Hierarchical Gamma model to predict APPC data.
    '''
    num_obs_ctxt = len(np.unique(observer[context == 1]))
    num_obs_noctxt = len(np.unique(observer[context == 0]))
    obs = [num_obs_noctxt, num_obs_ctxt]
    with Model() as pl:
        # Population level:
        obs_ambiguity = Normal(
            'DNP Mean_Ambiguity', mu=0, sd=500.0, shape=2)

        # Define variable for sd of data distribution:
        data_sd = pm.Gamma('Data_SD', *gamma_params(mode=y.std(), sd=y.std()))
        for ctxt, label in zip([1, 0], ['context', 'nocontext']):
            obs_offset = Normal('DNP Mean_Offset_' + label, mu=y.mean(),
                                sd=y.std() * 1.0)
            obs_sd_offset = Gamma('Mean_Offset_SD' + label, *gamma_params(mode=y.std(), sd=y.std()))

            # Observer level:
            offset = Normal(
                'DNP Offset_' + label, mu=obs_offset, sd=obs_sd_offset,
                shape=(obs[ctxt],))

            # Compute predicted mode for each fixation:
            data = y[context == ctxt]
            obs_c = observer[context == ctxt]
            ambig_reg_c = ambiguity_regressor[context == ctxt]

            b0 = obs_ambiguity.mean()
            obs_ambiguity_transformed = Deterministic("DNS Population Ambiguity" +label , obs_ambiguity-b0 )
            offset_transformed = Deterministic('DNS Subject Offsets ' + label, offset+b0)
            obs_offset_transformed = Deterministic('DNS Population Offsets ' + label, obs_offset+b0)
            oat = obs_ambiguity - b0
            # Dummy coding
            mode = (
                offset_transformed[obs_c] +
                obs_ambiguity_transformed[ambig_reg_c == 1])
            # Convert to shape rate parameterization
            shape, rate = gamma_params(mode, data_sd)
            data_dist = Gamma('Data_' + label, shape, rate, observed=data)
    return pl
Ejemplo n.º 3
0
def gamma_model_2conditions(y, x, observer, condition, observed=True):
    '''
    Hierarchical Gamma model to predict fixation durations.
    '''
    # Different slopes for different observers.
    num_observer = len(np.unique(observer))
    print '\n Num Observers: %d \n' % num_observer
    with Model() as pl:
        obs_splits = TruncatedNormal(
            'Mean_Split', mu=90,
            sd=500, lower=5, upper=175)
        obs_offset = Normal('Mean_Offset', mu=y.mean(), sd=y.std()*10.0)
        obs_slopes1 = Normal('Mean_Slope1', mu=0.0, sd=1.0)
        obs_slopes2 = Normal('Mean_Slope2', mu=0, sd=1.0)

        obs_sd_split = pm.Gamma(
            'Obs_SD_Split', *gamma_params(mode=1.0, sd=100.0))

        obs_sd_intercept = pm.Gamma(
            'Obs_SD_Offset', *gamma_params(mode=1, sd=100.))

        obs_sd_slopes1 = pm.Gamma(
            'Obs_SD_slope1', *gamma_params(mode=.01, sd=2.01))
        obs_sd_slopes2 = pm.Gamma(
            'Obs_SD_slope2', *gamma_params(mode=.01, sd=2.01))

        data_sd = pm.Gamma('Data_SD', *gamma_params(mode=y.std(), sd=y.std()))

        split = TruncatedNormal(
            'Split', mu=obs_splits, sd=obs_sd_split,
            lower=5, upper=175, shape=(num_observer,))

        intercept = Normal(
            'Offset', mu=obs_offset, sd=obs_sd_intercept,
            shape=(num_observer,))
        slopes1 = Normal(
            'Slope1', mu=obs_slopes1, sd=obs_sd_slopes1,
            shape=(num_observer,))
        slopes2 = Normal(
            'Slope2', mu=obs_slopes2, sd=obs_sd_slopes2,
            shape=(num_observer,))
        # Now add the condition part
        # 
        split_cond = Normal(
            'Cond_Split', mu=0, sd=10, shape=(2,))
        intercept_cond = Normal(
            'Cond_Offset', mu=0, sd=20,
            shape=(2,))
        slopes1_cond = Normal(
            'Cond_Slope1', mu=0, sd=1,
            shape=(2,))
        slopes2_cond = Normal(
            'Cond_Slope2', mu=0, sd=1,
            shape=(2,))
        intercept_cond = intercept_cond - intercept_cond.mean()
        split_cond = split_cond - split_cond.mean()
        slopes1_cond = slopes1_cond - slopes1_cond.mean()
        slopes2_cond = slopes2_cond - slopes2_cond.mean()

        mu_sub = piecewise_predictor(
            x, 
            split[observer] + split_cond[condition], 
            intercept[observer] + intercept_cond[condition],
            slopes1[observer] + slopes1_cond[condition], 
            slopes2[observer] + slopes2_cond[condition]
            )

        shape, rate = gamma_params(mu_sub, data_sd)
        data = Gamma('Data', shape, rate, observed=y)
    return pl