diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java index b3659f317..7d28013aa 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java @@ -17,6 +17,7 @@ public abstract class AssociationContext { protected List> window; private int size; private int slide; + protected double zVal; public AssociationContext() { } @@ -42,6 +43,7 @@ public abstract class AssociationContext { size = walker.windowSize; slide = walker.slideBy; window = new ArrayList>(size); + zVal = walker.zVal; } public Map mapLocus(MapExtender extender) { diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java index f583429b8..b353e145c 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java @@ -42,10 +42,12 @@ public class AssociationTestRunner { return Math.min((int) Math.floor(QualityUtils.phredScaleErrorRate(p)),MAX_Q_VALUE); } - public static Pair> getTestValues(AssociationContext context) { + public static Pair,Pair> getTestValues(AssociationContext context) { if ( context instanceof StatisticalTest ) { Pair statAndP = ((StatisticalTest) context).getStatisticAndPValue(); - return new Pair>(statAndP.first, + Double delta = ((StatisticalTest) context).getZConfDelta(); + return new Pair,Pair>( + new Pair(statAndP.first,delta), new Pair(statAndP.second,pToQ(statAndP.second))); } @@ -54,10 +56,10 @@ public class AssociationTestRunner { public static String runTests(AssociationContext context) { if ( context instanceof StatisticalTest ) { - Pair> results = getTestValues(context); - return String.format("%s: %.2f\tP: %.2e\tQ: %d", + Pair,Pair> results = getTestValues(context); + return String.format("%s: %.2f\tD: %.2f\tP: %.2e\tQ: %d", ((StatisticalTest) context).getStatisticName() , - results.first,results.second.first,results.second.second); + results.first.first,results.first.second,results.second.first,results.second.second); } return null; diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java index 9baa30e95..21a26388d 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java @@ -62,14 +62,14 @@ public class RegionalAssociationHandler { // todo -- maybe the tdf should be the whole window rather than just the most recent loc? String outVal; if ( bedGraphFormat ) { - Pair> statVals = AssociationTestRunner.getTestValues(context); + Pair,Pair> statVals = AssociationTestRunner.getTestValues(context); Pair simpleDichotVals = AssociationTestRunner.getDichotomizedValues(context); - outVal = String.format("%.2f\t%.2e\t%d\t%.2f\t%.2f",statVals.first,statVals.second.first,statVals.second.second, - simpleDichotVals.first,simpleDichotVals.second); + outVal = String.format("%.2f\t%.2f\t%.2e\t%d\t%.2f\t%.2f",statVals.first.first,statVals.first.second, + statVals.second.first,statVals.second.second,simpleDichotVals.first,simpleDichotVals.second); } else { outVal = AssociationTestRunner.runTests(context); Pair simpleDichotVals = AssociationTestRunner.getDichotomizedValues(context); - outVal += String.format("\tD: %.2f\tLogD: %.2f",simpleDichotVals.first,simpleDichotVals.second); + outVal += String.format("\tDi: %.2f\tLogDi: %.2f",simpleDichotVals.first,simpleDichotVals.second); } return String.format("%s\t%d\t%d\t%s",maps.getReferenceContext().getLocus().getContig(), maps.getReferenceContext().getLocus().getStart()-context.getWindowSize()-1,maps.getReferenceContext().getLocus().getStart()+1, outVal); diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java index 9595861b0..dec7d2808 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java @@ -41,6 +41,10 @@ public class RegionalAssociationWalker extends LocusWalker> im return new Pair(z,p); } + // todo -- this is a temporary method, it needs to be merged in with others if it proves useful + public Double getZConfDelta() { + Map> caseControlCounts = getCaseControl(); + if ( caseControlCounts == null || caseControlCounts.get(CaseControl.Cohort.CASE) == null || caseControlCounts.get(CaseControl.Cohort.CONTROL) == null ) { + return Double.NaN; + } + double pCase = caseControlCounts.get(CaseControl.Cohort.CASE).first.doubleValue()/caseControlCounts.get(CaseControl.Cohort.CASE).second.doubleValue(); + double pControl = caseControlCounts.get(CaseControl.Cohort.CONTROL).first.doubleValue()/caseControlCounts.get(CaseControl.Cohort.CONTROL).second.doubleValue(); + double nCase = caseControlCounts.get(CaseControl.Cohort.CASE).second.doubleValue(); + double nControl = caseControlCounts.get(CaseControl.Cohort.CONTROL).second.doubleValue(); + + double p2 = (caseControlCounts.get(CaseControl.Cohort.CASE).first.doubleValue()+caseControlCounts.get(CaseControl.Cohort.CONTROL).first.doubleValue())/ + (caseControlCounts.get(CaseControl.Cohort.CASE).second.doubleValue()+caseControlCounts.get(CaseControl.Cohort.CONTROL).second.doubleValue()); + double se = Math.sqrt(p2*(1-p2)*(1/nCase + 1/nControl)); + + double z = (pCase-pControl)/se; + + return ( z < 0 ? -1.0*se*(z-zVal) : se*(z-zVal)); + } + public String getStatisticName() { return "Z"; } } \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/ValueTest.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/ValueTest.java index 5082e6f2f..0c344bb63 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/ValueTest.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/ValueTest.java @@ -100,4 +100,22 @@ public abstract class ValueTest extends CaseControl> implemen return new Pair(t,p); } + public Double getZConfDelta() { + Map> caseControlVectors = getCaseControl(); + if ( caseControlVectors == null || caseControlVectors.get(CaseControl.Cohort.CASE) == null || caseControlVectors.get(CaseControl.Cohort.CONTROL) == null ) { + return Double.NaN; + } + double meanCase = MathUtils.average(caseControlVectors.get(CaseControl.Cohort.CASE),true); + double varCase = MathUtils.variance(caseControlVectors.get(CaseControl.Cohort.CASE),meanCase,true); + double nCase = caseControlVectors.get(CaseControl.Cohort.CASE).size(); + double meanControl = MathUtils.average(caseControlVectors.get(CaseControl.Cohort.CONTROL),true); + double varControl = MathUtils.variance(caseControlVectors.get(CaseControl.Cohort.CONTROL),meanControl,true); + double nControl = caseControlVectors.get(CaseControl.Cohort.CONTROL).size(); + double dnom = Math.sqrt(varCase/nCase+varControl/nControl); + + double t = (meanCase-meanControl)/dnom; + + return ( t < 0 ? -1.0*dnom*(t-zVal) : dnom*(t-zVal)); + } + } diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/statistics/StatisticalTest.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/statistics/StatisticalTest.java index 50ee8ad05..f3b66ca3f 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/statistics/StatisticalTest.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/statistics/StatisticalTest.java @@ -12,4 +12,5 @@ import org.broadinstitute.sting.utils.collections.Pair; public interface StatisticalTest { public abstract Pair getStatisticAndPValue(); public abstract String getStatisticName(); + public abstract Double getZConfDelta(); }