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
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