示例#1
0
文件: lapse.py 项目: ivanov/PyPsy
try:
    lapse
except NameError:
    lapse = 0.00

doPlots = False
gridGrain = 150
numlevels = 6
trials_per = trials/numlevels
alpha = 10.0
beta = 3.0
levels_frac = np.array([.1,.3,.4,.6,.7,.9]) # Prins' s2
params2=[alpha,beta,0,0] # Wichmann/Prins use this to gen some initial values
params=[alpha,beta,0.5,lapse]

alphas = np.logspace( *np.log10( pf.fn_weibull_inv(np.array([0.01,0.99]), params2) ), num=gridGrain )
betas = np.logspace( -1.0, 2.0, gridGrain)
gamma = 0.5
lambdas = np.arange( 0, .06+np.finfo(float).eps, 0.005)

# Model:
fit1 =  pf.pf_generic( pf.fn_weibull, params, [0,1,3])

# Data:
levels = pf.fn_weibull_inv( levels_frac, params2  )
trials_arr = np.tile( trials_per, numlevels)
data=pf.experiment(levels, trials_arr, pcorr=pf.fn_weibull( levels, [alpha,beta,0.5,0]) )
data.simulate()

# Rebuild the huge grid of initial LogPs if we need to
# Takes about 16.5 secs on my Thinkpad x60
示例#2
0
文件: utils.py 项目: ivanov/PyPsy
def param_scatter(params, true_params, idxOfLapse=3, ax=None, needToConvert=False, plot_marginals=False):
    global axMargx, axMargy

    if needToConvert:
        fit_params_adj = np.array( [pf.convertToWichmann( p ) for p in params] )
    else:
        fit_params_adj = np.copy(params)

    true_pse = pf.fn_weibull_inv(0.5, true_params )
    true_slope = pf.fn_weibull_deriv( true_pse, true_params )

    laps_lowers = np.where( fit_params_adj[:,idxOfLapse] < 0.0001 )[0]
    laps_uppers = np.where( fit_params_adj[:,idxOfLapse] >= 0.0599)[0]
    laps_mids = np.where( np.all((fit_params_adj[:,idxOfLapse] >= 0.0001,fit_params_adj[:,idxOfLapse] < 0.0599),0) )[0]
    
    if ax==None:
        fig=plt.figure()
        ax = fig.add_subplot(1,1,1)

    if plot_marginals:
        divider = make_axes_locatable( ax)
        # create a new axes with a height of 1.2 inch above the axScatter
        axMargx = divider.new_vertical(1.2, pad=0.22, sharex=ax)
        # create a new axes with a width of 1.2 inch on the right side of the
        # axScatter
        # TODO: Figure out how to make the hists not overlap with the scatter
        axMargy = divider.new_horizontal(1.2, pad=0.22, sharey=ax)

    ax.plot( fit_params_adj[laps_lowers,0], fit_params_adj[laps_lowers,1], 'bx', label='$\lambda_{est}=0$' )
    ax.plot( fit_params_adj[laps_mids,0], fit_params_adj[laps_mids,1], 'g*', label='$\lambda_{est}\/{o.w.}$' )
    ax.plot( fit_params_adj[laps_uppers,0], fit_params_adj[laps_uppers,1], 'r.', label='$\lambda_{est}=0.6$' )
    ax.legend( loc='upper left')
    ax.axis('tight')

    x = [fit_params_adj[:,0].min(), fit_params_adj[:,0].max()]
    y = [fit_params_adj[:,1].min(), fit_params_adj[:,1].max()]

    ax.plot( [true_pse, true_pse], [fit_params_adj[:,1].min(), fit_params_adj[:,1].max()], 'k:' )
    ax.plot( [fit_params_adj[:,0].min(), fit_params_adj[:,0].max()], [true_slope, true_slope], 'k:' )
    ax.set_xlabel('pse (~%.4g)' % true_pse )
    ax.set_ylabel('slope@pse (~%.4g)' % true_slope)
    ax.loglog()

    mean0 = np.mean( fit_params_adj[laps_lowers], 0 )
    mean1 = np.mean( fit_params_adj[laps_mids], 0 )
    mean2 = np.mean( fit_params_adj[laps_uppers], 0 )

    xbins = 30
    ybins = 30
    if plot_marginals:
        fig.add_axes(axMargx)
        axMargx.hist( fit_params_adj[:,0], bins=xbins )
        fig.add_axes(axMargy)
        ax.axis('tight')
        axMargy.set_yscale("log", nonposy='clip')
        bins = 10**np.linspace( np.log10(y[0]), np.log10(y[1]), num=ybins )
        axMargy.hist( fit_params_adj[:,1],orientation='horizontal', bins=bins )
        oldticks = axMargy.get_xticklabels()
        [tick.set_rotation(-90) for tick in oldticks]
        ax.axis('tight')

    covarp=np.cov(fit_params_adj.T);
    sep=np.sqrt(np.diag(covarp))
    corp=covarp/(sep.T*sep);
    corrp=[corp[1,0],corp[idxOfLapse,0],corp[idxOfLapse,1]]

    covar0 = np.cov(fit_params_adj[laps_lowers].T); se0 = np.sqrt( np.diag( covar0))
    covar1 = np.cov(fit_params_adj[laps_mids].T); se1 = np.sqrt( np.diag( covar1))
    covar2 = np.cov(fit_params_adj[laps_uppers].T); se2 = np.sqrt( np.diag( covar2))

    tiny=8
    covartop = 0.3
    hite = 0.05
    ax.text( 0.05, covartop, r'$corr_{\alpha,\beta}$=%.4g' % corrp[0],
            horizontalalignment='left', verticalalignment='top', transform=ax.transAxes)
    ax.text( 0.05, covartop-hite, r'$corr_{\alpha,\lambda}$=%.4g' % corrp[1],
            horizontalalignment='left', verticalalignment='top', transform=ax.transAxes)
    ax.text( 0.05, covartop-2*hite, r'$corr_{\beta,\lambda}$=%.4g' % corrp[2],
            horizontalalignment='left', verticalalignment='top', transform=ax.transAxes)

    parmstop = 0.12
    hite2 = 0.04
    ax.text( 0.05, parmstop, '$\mu_{0.0}$=%s' % (mean_se_string(mean0, se0)),
            horizontalalignment='left', verticalalignment='top', transform=ax.transAxes, size=tiny)
    ax.text( 0.05, parmstop-hite2, '$\mu$=%s' % (mean_se_string(mean1, se1)),
            horizontalalignment='left', verticalalignment='top', transform=ax.transAxes, size=tiny)
    ax.text( 0.05, parmstop-hite2*2, '$\mu_{0.06}$=%s' % (mean_se_string(mean2, se2)),
            horizontalalignment='left', verticalalignment='top', transform=ax.transAxes, size=tiny)

    return covarp, sep, corp, corrp