Dynamic Cluster Detection using pl/r functions

The ability to detect clusters of outbreaks as soon as possible was investigated. Cluster detection methods were coded as procedural language functions in the database and made available through a web interface. Methods available through this interface include CUSUM (Rossi et al., 1999), log-linear regression (Farrington et al., 1996), generalised likelihood ratio (Höhle et al., 2009) and Bayesian (Reibler, 2004 in German, cited in Höhle, 2007) algorithms provided through the R package Surveillance (Höhle, 2007).

The example code below illustrates the code for the Farrington log-linear regression model.

PL/R Function

CREATE OR REPLACE FUNCTION outbreak_farr_uni(bound integer, startweek date, endweek date, back integer, wind integer, serotype varchar, directory text) RETURNS text
AS $_$
db<-NA
this_filename = basename(tempfile("outbreak_cdc_uni", directory))
this_file = file.path(directory, this_filename)
library(Cairo)
library(zoo)
library(rgeos)
library(surveillance)
gpclibPermit()
if(serotype=='') {
serotype='all'
}
q <- "SELECT datefrom AS reportdate, count(gid) FROM outbreaks "
if(serotype != 'all') {
q }
q res rez rey
# Convert back to ts
tmp dates # Create sts class
red # Replace NA's with 0
red@observed[is.na(red@observed)] # Add a reasonable upper bound?
red@upperbound red@upperbound] period = startweek & dates <= endweek)
red.farr Cairo(paste(this_file, ".png", sep = ""), type='png', height=768, width=1024)
plot(red.farr, main = 'Log-linear regression of outbreak reports', sub='after Farrington et al, 1996', xlab='Year / Quarter', ylab='Reports per week', legend.opts=list(horiz=TRUE, bty='n'))
dev.off()
Cairo(paste(this_file, ".pdf", sep = ""), type='pdf', title='Created by ACIAR ULM Project', height=30, width=40, units='cm')
plot(red.farr, main = 'Log-linear regression of outbreak reports', sub='after Farrington et al, 1996', xlab='Year / Quarter', ylab='Reports per week', legend.opts=list(horiz=TRUE, bty='n'))
dev.off()
system(paste("chmod 666 ", this_file, ".png", sep=""), intern = FALSE, ignore.stderr = TRUE)
system(paste("chmod 666 ", this_file, ".pdf", sep=""), intern = FALSE, ignore.stderr = TRUE)
return(this_filename)
$_$ LANGUAGE plr;

If you copy and paste this code into psql it should produce a working function.

I have it embedded in a web page with four other algorithms, where the code (in php) looks a bit like :

<div id='farrington' class='thumbnail'>
 <h3>
 Log-linear regression model (Farrington et al, 1996)
 </h3>
 <?php
 $q= "SELECT outbreak_farr_uni(:bound, :startweek, :endweek, :back, :wind, :serotype, :plr_tmp)";
 $iarray=[
 ":bound" => $bound,
 ":startweek" => $startweek,
 ":endweek" => $endweek,
 ":back" => $back,
 ":wind" => $wind,
 ":serotype" => $serotype,
 ":plr_tmp" => $plr_tmp
 ];
 $query = $dpg->prepare($q);
 try {
 $query->execute($iarray);
 $result = $query->fetchColumn();
 echo "<a onclick='return bigimage(\"tmp/$result\", 1024,678)'>
 <img src='tmp/".$result.".png' width='320' height='240'>
 </a>";
 } catch(exception $e) {
 echo "<br>
 <b>
 There was an error with this algorithm.
 </b>
 <p>
 A common cause is a lack of consistent data during the selected date range,
 please check the parameters (and have a look at the Analysis Range in the
 Full outbreak listing above).
 </p>
 <br><br><br>";
 }
 ?>
 <p>b:
 <input type='text' name='back' size='2' maxlength='2' value='<?= $back ?>'>
 </p>
 <p>m:
 <input type='text' name='wind' size='2' maxlength='2' value='<?= $wind ?>'>
 </p>
 <br>
</div>

 

Which should produce a thumbnail chart in the page.

Thumbnail
Clicking on the plot opens a window with a powerpoint sized (1024 x 768) large png version, and has a link to download a pdf version (for embedding in documents etc).

Outbreak detection

 

REFERENCES

Farrington, C., Andrews, N., Beale, A., and Catchpole, M. (1996). A statistical algorithm for the early detection of outbreaks of infectious disease. Journal of the Royal Statistical Society. Series A (Statistics in Society), 159(3):547–563.

Höhle, M. (2007). surveillance: An R package for the monitoring of infectious diseases. Computational Statistics, 22(4):571–582.

Höhle, M., Paul, M., and Held, L. (2009). Statistical approaches to the monitoring and surveillance of infectious diseases for veterinary public health. Preventive Veterinary Medicine, 91(1):2–10.

Rossi, G., Lampugnani, L., and Marchi, M. (1999). An approximate CUSUM procedure for surveillance of health events. Statistics in Medicine, 18(16):2111–2122.