コード例 #1
0
ファイル: MIp.cs プロジェクト: incorux/ProtCoev
        public double[,] GetMIps()
        {
            var averageMI = MIs.Average();
            var length    = (int)Math.Sqrt(MIs.Length);

            Parallel.For(0, length, i =>
            {
                for (j = 0; j < length; j++)
                {
                    APCs[i, j] = APCs[j, i] = MIs.AverageColumn(i) * MIs.AverageColumn(j) / averageMI;
                    MIps[i, j] = MIps[j, i] = MIs[i, j] - APCs[i, j];
                }
            });
            Zscores = MIps.CalculateZscore();
            return(Zscores);
        }
コード例 #2
0
        public double[,] getDI()
        {
            const int q             = 21;
            var       identityTable = new double[_count];

            Parallel.For(0, _count, i =>
            {
                identityTable[i] = GetIdenticalSequences(i);
            });
            var rawsum = identityTable.Sum(n => 1 / n);
            var mEff   = Math.Round(rawsum, 2);

            MIs = new double[length, length];
            var frequencies = new double[length, q];

            /////////// LOGIC ////////////////////////
            /////////////////////////////// SINGULAR EQ [2] & [1] //////////////////////////////////
            Parallel.For(0, length, i =>
            {
                // Take a row from base if supplied
                var index1 = columns != null ? columns[i] : i;

                for (j = 0; j < _count; j++)
                {
                    var c = alg[j, index1];
                    frequencies[i, c.ToInt()] += 1 / identityTable[j];
                }
                for (j = 0; j < q; j++)
                {
                    if (frequencies[i, j] == 0)
                    {
                        continue;
                    }
                    var addItem = mEff / q;
                    // Assume gamma == mEff
                    var divisor        = 2 * mEff;
                    frequencies[i, j] += addItem;
                    frequencies[i, j] /= divisor;
                }
            });
            ////////////////////////////// PAIRS //////////////////////////////////////
            Parallel.For(0, length, column1 =>
            {
                // Second column
                for (column2 = column1 + 1; column2 < length; column2++)
                {
                    // Take from base if supplied
                    int index1, index2;
                    if (columns != null)
                    {
                        index1 = columns[column1];
                        index2 = columns[column2];
                    }
                    else
                    {
                        index1 = column1;
                        index2 = column2;
                    }

                    var frequenciesPairs = new double[q, q];
                    // For each row
                    for (var j = 0; j < _count; j++)
                    {
                        var c1 = alg[j, index1];
                        var c2 = alg[j, index2];
                        var d1 = c1.ToInt();
                        var d2 = c2.ToInt();
                        frequenciesPairs[d1, d2] += 1 / identityTable[j];
                    }
                    // EQ [1]
                    for (j = 0; j < q; j++)
                    {
                        for (l = 0; l < q; l++)
                        {
                            if (frequenciesPairs[j, l] == 0)
                            {
                                continue;
                            }
                            var addItem             = mEff / (q * q);
                            var divisor             = (2 * mEff);
                            frequenciesPairs[j, l] += addItem;
                            frequenciesPairs[j, l] /= divisor;
                        }
                    }
                    // EQ [3]
                    // For every aminoacids combination
                    for (m = 0; m < q; m++)
                    {
                        for (l = 0; l < q; l++)
                        {
                            if (frequenciesPairs[m, l] == 0)
                            {
                                continue;
                            }
                            var number = frequenciesPairs[m, l] /
                                         (frequencies[column1, m] * frequencies[column2, l]);
                            var log = Math.Log(number, Math.E);
                            MIs[column1, column2] += frequenciesPairs[m, l] * log;
                        }
                    }
                    MIs[column2, column1] = MIs[column1, column2];
                }
            });
            var Zscores = MIs.CalculateZscore();

            return(Zscores);
        }
コード例 #3
0
        public double[,] GetZscores()
        {
            /////////// MIs
            MIs = new double[_length, _length];
            Parallel.For(0, _length, i =>
            {
                for (j = i + 1; j < _length; j++)
                {
                    // ROWS
                    int index1, index2;
                    if (columns != null)
                    {
                        index1 = columns[i];
                        index2 = columns[j];
                    }
                    else
                    {
                        index1 = i;
                        index2 = j;
                    }
                    var d1    = AminoAcids.GetAminoAcidDictionaryDouble();
                    var d2    = AminoAcids.GetAminoAcidDictionaryDouble();
                    var pairs = new double[20, 20];
                    var total = 0;
                    for (var k = 0; k < _count; k++)
                    {
                        var c1 = alg[k, index1];
                        var c2 = alg[k, index2];
                        if (c1.ToInt() == 20 || c2.ToInt() == 20)
                        {
                            continue;
                        }
                        total++;
                        pairs[c1.ToInt(), c2.ToInt()]++;
                        d1[c1]++;
                        d2[c2]++;
                    }
                    var sumHx  = d1.Values.Sum(n => n == 0.0 ? 0 : n / total * (Math.Log(n / total, 20)));
                    var sumHy  = d2.Values.Sum(n => n == 0.0 ? 0 : n / total * (Math.Log(n / total, 20)));
                    var sumHxy = 0.0;
                    for (k = 0; k < 20; k++)
                    {
                        for (l = 0; l < 20; l++)
                        {
                            if (pairs[k, l] == 0.0)
                            {
                                continue;
                            }
                            sumHxy += pairs[k, l] / total * (Math.Log(pairs[k, l] / total) / Math.Log(20));
                        }
                    }
                    // Normalization:  / -sumHxy
                    if (i == j || sumHxy == 0)
                    {
                        MIs[i, i] = 0;
                    }
                    else
                    {
                        MIs[i, j] = MIs[j, i] = (-sumHx - sumHy + sumHxy) / -sumHxy;
                    }
                }
            });
            var zscores = MIs.CalculateZscore();

            return(zscores);
        }