private void convertResultsToPValues(WorkPackage wp, Result dsResults) { // per probe, convert to p-value int numProbes = dsResults.zscores[0].length; boolean hasResults = false; for (int p = 0; p < numProbes; p++) { int nrDatasetsPassingQC = 0; int nrTotalSamples = 0; double zSum = 0; double betasum = 0; for (int d = 0; d < m_numDatasets; d++) { // TODO: check whether this actually returns the correct Z-scores: should the stored values // be flipped? double zscore = dsResults.zscores[d][p]; double correlation = dsResults.correlations[d][p]; Integer numSamples = dsResults.numSamples[d]; if (!Double.isNaN(correlation)) { boolean flipalleles = wp.getFlipSNPAlleles()[d]; if (m_useAbsoluteZScores) { zscore = Math.abs(zscore); dsResults.zscores[d][p] = Math.abs(zscore); dsResults.correlations[d][p] = Math.abs(correlation); if (!Double.isNaN(dsResults.beta[d][p])) { dsResults.beta[d][p] = Math.abs(dsResults.beta[d][p]); } wp.getFlipSNPAlleles()[d] = false; } else if (flipalleles) { zscore = -zscore; // dsResults.zscores[d][p] = zscore; // correlation = -correlation; // dsResults.correlations[d][p] = correlation; } nrDatasetsPassingQC++; double weight = Descriptives.getSqrt(numSamples); zSum += (zscore * weight); nrTotalSamples += numSamples; if (determinebeta) { if (flipalleles) { betasum += (-dsResults.beta[d][p] * numSamples); dsResults.beta[d][p] = -dsResults.beta[d][p]; } else { betasum += (dsResults.beta[d][p] * numSamples); } } } } if (nrTotalSamples > 0 && (testSNPsPresentInBothDatasets && nrDatasetsPassingQC == m_numDatasets) || (!testSNPsPresentInBothDatasets && nrDatasetsPassingQC > 0)) { testsPerformed++; hasResults = true; double sqrtSample = Descriptives.getSqrt(nrTotalSamples); double zScore = zSum / sqrtSample; double pValueOverall = Descriptives.convertZscoreToPvalue(zScore); dsResults.pvalues[p] = pValueOverall; dsResults.finalZScore[p] = zScore; // determine assessed allele.... if (determinebeta) { betasum /= nrTotalSamples; double metase = 1 / Math.sqrt(nrTotalSamples); dsResults.finalBeta[p] = betasum; dsResults.finalBetaSe[p] = metase; } } else { dsResults.pvalues[p] = Double.NaN; dsResults.finalZScore[p] = Double.NaN; } } wp.setHasResults(hasResults); wp.setResult(dsResults); }