/* * #%L * gitools-core * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.analysis.correlation.methods; import org.gitools.analysis.AbstractMethod; import org.gitools.analysis.MethodException; import org.gitools.analysis.correlation.CorrelationMethod; import org.gitools.analysis.correlation.CorrelationResult; import java.util.Iterator; import java.util.Properties; public class PearsonCorrelationMethod extends AbstractMethod implements CorrelationMethod { public static final String ID = "pearson"; public PearsonCorrelationMethod(Properties properties) { super(ID, "Pearson's correlation", "Pearson's product-moment correlation", CorrelationResult.class, properties); } @Override public CorrelationResult correlation(Iterable<Double> x, Iterable<Double> y, Double valueNaN) throws MethodException { Iterator<Double> xIterator = x.iterator(); Iterator<Double> yIterator = y.iterator(); int n = 0; double sumXY = 0, sumX = 0, sumX2 = 0, sumY = 0, sumY2 = 0; while (xIterator.hasNext() && yIterator.hasNext()) { Double xi = xIterator.next(); Double yi = yIterator.next(); if (xi == null) { xi = valueNaN; } if (yi == null) { yi = valueNaN; } if (xi == null || yi == null || Double.isNaN(xi) || Double.isNaN(yi)) { continue; } n++; sumXY += xi * yi; sumX += xi; sumX2 += xi * xi; sumY += yi; sumY2 += yi * yi; } double score = (sumXY - (sumX * sumY / n)) / Math.sqrt((sumX2 - (sumX * sumX / n)) * (sumY2 - (sumY * sumY / n))); double standardError = Math.sqrt((1 - (score * score)) / (n - 2)); return new CorrelationResult(n, score, standardError); } }