Wald's SPRT algorithm
- To: mathgroup at smc.vnet.net
- Subject: [mg129801] Wald's SPRT algorithm
- From: richardgreco at gmail.com
- Date: Fri, 15 Feb 2013 01:56:48 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
Has anyone worked with Sequential Probability Ratio Test (SPRT) in Mathematica. I have this SPRT which looks at a BernoulliDistribution[] (see below) for successes out of trials. My application is comparing means of two distributions and to determine if I should accept or reject a hypothesis. I am having a hard time working out it out for my application, a PoissonDistribution and comparing the means. What I am looking to do is, if I keep taking data every minute from a sensor (sensor reading 120 cpm for exmaple), I want to be able to know if it is over a threshold or is it background using SPRT. Here is the notebook for the Bernoulli process using BernoulliDistributions. I started with this article: "The Sequential Probability Ratio Test" Phil, Robert L. (1998) Null; alpha = .05; beta = .05; p0 = .8; p1 = .98; k0 = alpha/(1 - beta); k1 = (1 - alpha)/beta; c0 = Log[k0]; c1 = Log[k1]; plt1 = Plot[{c0, c1}, {x, 0, 20}, PlotRange -> {1.7 c0, 1.7*c1}, DisplayFunction -> Identity]; f0[x_] := PDF[BernoulliDistribution[p0], x] f1[x_] := PDF[BernoulliDistribution[p1], x] LLR[x_] := Log[f0[x]/f1[x]] Truep = .95; sum = 0; stopflag = 0; decflag = .5; n = 0; printflag = 1; sumData = {}; Print["n", " ", "samplepoint", " ", "LLR[samplepoint]", " ", \ "sum", " ", "stopflag", " ", "decflag"] While[stopflag == 0, n = n + 1; samplepoint = Random[BernoulliDistribution[Truep]]; sum = sum + LLR[samplepoint]; AppendTo[sumData, {n, sum}]; If[sum < c0, stopflag = 1; decflag = 1;, If[sum > c1, stopflag = 1; decflag = 0;, Null];]; If[printflag > 0, Print[n, " ", samplepoint, " ", LLR[samplepoint], " ", sum, " ", stopflag, " ", decflag], Null]] plt2 = ListPlot[sumData, PlotStyle -> {PointerSize[.015]}, DisplayFunction :> Identity]; Show[{plt1, plt2}, DisplayFunction -> $DisplayFunction]