|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 2745 (0xab9)
Types: TextFile
Names: »dprime.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen
└─⟦this⟧ »cph85dist/stat/src/dprime.c«
#include "unixstat.h"
PGM(dprime,Signal Detection Theory Analysis,5.0,1985)
/* Copyright (c) 1982 Gary Perlman (see Copyright file) */
#define MAXCOLS 2
char *column[MAXCOLS];
int presented, obtained;
int hit, miss, false_alarm, correct_rejection;
double hr, far;
double dprime, beta;
#define table(fmt,v1,v2,v3,v4) printf ("%fmt %fmt %fmt %fmt\n",v1,v2,v3,v4)
fparseline (ioptr, array, maxcols)
FILE *ioptr;
char **array;
{
static char line[BUFSIZ];
if (fgets (line, BUFSIZ, ioptr))
return (parseline (line, array, maxcols));
else return (EOF);
}
main (argc, argv) char **argv;
{
double ptoz (), normaldensity ();
int ncols;
ARGV0;
if (argc != 1 && argc != 3)
USAGE ([hit-rate false-alarm-rate])
if (argc == 1)
{
checkstdin (Argv0);
while ((ncols = fparseline (stdin, column, MAXCOLS)) != EOF)
{
if (ncols == 0) continue;
if (ncols != 2)
ERRMSG0 (each line must have 2 columns)
presented = yesno (column[0]);
obtained = yesno (column[1]);
if (presented)
{
if (obtained) hit++;
else miss++;
}
else /* not presented */
{
if (obtained) false_alarm++;
else correct_rejection++;
}
}
printf ("%15s%15s%15s\n", "", "signal", "noise");
printf ("%15s%15d%15d\n", "yes", hit, false_alarm);
printf ("%15s%15d%15d\n", "no", miss, correct_rejection);
putchar ('\n');
hr = hit ? hit / (double) (hit + miss) : 0.0;
far = false_alarm
? false_alarm / (double) (false_alarm + correct_rejection)
: 0.0;
}
else /* hit rate and false alarm rate supplied */
{
if (!number (argv[1])) ERRNUM (argv[1],hit-rate)
if (!number (argv[2])) ERRNUM (argv[2],false-alarm-rate)
hr = atof (argv[1]);
if (hr < 0.0 || hr > 1.0)
ERRVAL (g,hr,hit rate)
far = atof (argv[2]);
if (far < 0.0 || far > 1.0)
ERRVAL (g,far,false-alarm rate)
}
dprime = ptoz (hr) - ptoz (far);
beta = normaldensity (ptoz (hr)) / normaldensity (ptoz (far));
table (15s,"hr","far","dprime","beta");
table (15.2f,hr,far,dprime,beta);
exit (0);
}
char *yesses[] = {"yes", "1", "1.0000", "signal", ""};
char *noes[] = {"no", "0", "0.0000", "noise", ""};
yesno (string) char *string;
{
int strno;
for (strno = 0; *yesses[strno] && strcmp (string, yesses[strno]); strno++);
if (*yesses[strno]) return (1);
for (strno = 0; *noes[strno] && strcmp (string, noes[strno]); strno++);
if (*noes[strno]) return (0);
ERRMSG1 (illegal value (%s) in input, string)
/*NOTREACHED*/
}
double Pi; /* 3.15159 and all that */
double Denom; /* used by normal density function */
double normaldensity (z) double z;
{
double exp ();
return (exp (-z*z / 2.0) / Denom);
}
initial ()
{
double sqrt ();
Pi = acos (-1.0);
Denom = sqrt (2.0 * Pi);
}