Metadata-Version: 2.1
Name: FitPsyche
Version: 0.0.2
Summary: Psychometric curve fitting package for Python and MATLAB.
Home-page: https://github.com/garethjns/PsychometricCurveFitting
Author: Gareth Jones
Author-email: garethgithub@gmail.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: scipy
Requires-Dist: numpy
Requires-Dist: scikit-learn
Requires-Dist: matplotlib

# Psychometric curve fitting
![Tests](https://github.com/garethjns/PsychometricCurveFitting/workflows/Tests/badge.svg) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=garethjns_PsychometricCurveFitting&metric=alert_status)](https://sonarcloud.io/dashboard?id=garethjns_PsychometricCurveFitting)

Fitting for Psychometric curves in Python and Matlab. Supports:
  - [Simple logit link function (mean and varience parameters)](https://en.wikipedia.org/wiki/Psychometric_function).
  - [Wichmann and Hill 2001](http://wexler.free.fr/library/files/wichmann%20(2001)%20the%20psychometric%20function.%20i.%20fitting,%20sampling,%20and%20goodness%20of%20fit.pdf). This curve adds two additional parameters, "guess" and "lapse", which control somewhat for subject fallibility, improving the estimate of the discrimination threshold.

# Python usage
````bash
pip install fit-psyche
````

## Using Uses sklearn API.
````python
import numpy as np

from fit_psyche.psychometric_curve import PsychometricCurve

x = np.linspace(start=12, stop=16, num=6)
y = (x > x.mean()).astype(float)
y[2] = y[2] + np.abs(np.random.rand())
y[3] = y[3] - np.abs(np.random.rand())

pc = PsychometricCurve().fit(x, y)
pc.plot(x, y)
print(pc.score(x, y))
print(pc.coefs_)
````
![Example WH](https://raw.githubusercontent.com/garethjns/PsychometricCurveFitting/master/Images/WHPy.png)


# Matlab Usage
Fitting functions can be accessed by creating a PsychFit object, or directly. See also examples in scripts/.

```MATLAB
% Make up some data
y1 = [0 0 25 25 50 50 75 75 100 100]/100;
y2 = [20 20 20 30 40 60 70 80 80 80];
y2 = (y2+rand(1,numel(y2))*5)/100;
% Create x axis
x = 0.1:0.1:1;
```

## PsychFit object
### GLM
```MATLAB
ffit1 = fitPsyche(x, y1, 'GLM');
ffit2 = fitPsyche(x, y2, 'GLM');

figure
plotPsyche(ffit1)
hold on
plotPsyche(ffit2)
legend({'y1', 'y2', 'y1 fit', 'y2 fit'}, 'Location', 'NorthWest')
title('GLM fit')
```
![Example GLM](https://raw.githubusercontent.com/garethjns/PsychometricCurveFitting/master/Images/GLMObj.png)


### WH2001
```MATLAB
ffit1 = fitPsyche(x, y1, 'WH');
ffit2 = fitPsyche(x, y2, 'WH');

figure
plotPsyche(ffit1)
hold on
plotPsyche(ffit2)
legend({'y1', 'y2', 'y1 fit', 'y2 fit'}, 'Location', 'NorthWest')
title('WH 2001 fit')

disp(ffit1.model)
disp(ffit2.model)
```
![Example WH](https://raw.githubusercontent.com/garethjns/PsychometricCurveFitting/master/Images/WHObj.png)

### WH2001 with limited coefficients
```MATLAB
%% Set limits for WH fit

% g (guess rate), l (lapse), u (mean, bias), v (variance, discrimination
% thresh)
% UpperLimits:
UL = [0.05, 0.05, 1, 1]; % Limit upper bound of g and l to 5%
% StartPoints:
SP = [0, 0, 0.5, 0.5];
% LowerLimits:
LL = [0.05, 0.05, 0, 0];

ffit1 = fitPsyche(x, y2, 'WH', [UL;SP;LL]);
ffit2 = fitPsyche(x, y2, 'WH');
figure
plotPsyche(ffit1)
hold on
plotPsyche(ffit2)
legend({'y2', 'y2 limited fit', 'y2', 'y2 fit'}, 'Location', 'NorthWest')
title('WH 2001 fit')

disp(ffit1.model)
disp(ffit2.model)
```
![Example WH](https://raw.githubusercontent.com/garethjns/PsychometricCurveFitting/master/Images/WHObjLim.png)

## Direct method access
### GLM
```MATLAB
%% Fit GLM - access methods directly

[coeffs1, curve1, ~] = ...
    fitPsyche.fitPsycheCurveLogit(x, y1);
[coeffs2, curve2, ~] = ...
    fitPsyche.fitPsycheCurveLogit(x, y2);

% Plot
figure
scatter(x', y1')
hold on
scatter(x', y2')
plot(curve1(:,1),curve1(:,2))
plot(curve2(:,1),curve2(:,2))
legend({'y1', 'y2', 'y1 fit', 'y2 fit'}, 'Location', 'NorthWest')
title('GLM fit')
```
![Example GLM](https://raw.githubusercontent.com/garethjns/PsychometricCurveFitting/master/Images/GLMFit.png)

### WH2001
```MATLAB
[ffit1, curve1] = ...
    fitPsyche.fitPsycheCurveWH(x, y1);
[ffit2, curve2] = ...
    fitPsyche.fitPsycheCurveWH(x, y2);

% Plot
figure
scatter(x', y1')
hold on
scatter(x', y2')
plot(ffit1)
plot(ffit2)
legend({'y1', 'y2', 'y1 fit', 'y2 fit'}, 'Location', 'NorthWest')
title('WH2001 fit')
```
![Example WH](https://raw.githubusercontent.com/garethjns/PsychometricCurveFitting/master/Images/WHDirect.png)


