public static void GlmPoisson1()
        {
            UnitTestEqualityComparer comparer = new UnitTestEqualityComparer(8);

            double[][] input =
                GravityCourseData.Select(
                    x => new double[]
            {
                Math.Log(x.Distance),
                x.CommonBorder,
                x.CommonLanguage,
                x.ColonialRelationship,
                x.Importer.GetHashCode()
            })
                .ToArray()
                .Indicate(4);

            double[] response =
                GravityCourseData.Select(x => x.Trade)
                .ToArray();

            double[] weights =
                Enumerable.Repeat(1.0, response.Length)
                .ToArray();

            GeneralizedLinearModel <double> generalized =
                GeneralizedLinearModel.PoissonRegression(input, response, weights);

            int n  = input.Length;
            int k  = input[0].Length + 1;
            int df = n - k;

            double[] coefficients = new double[] { 13.728590, -0.772651, 0.180037, -0.876162, -0.078427 };
//
//            double[] varianceOls = new double[] { 4.110142e-07, 5.480129e-07, 1.331497e-06 };
//            double[] varianceHC0 = new double[] { 0.005335,  0.011331,  0.028898 };
//            double[] varianceHC1 = new double[] { 0.005335, 0.011331,  0.028898 };
//
//            double[] standardErrorsOls = varianceOls.Select(Math.Sqrt).ToArray();
//            double[] standardErrorsHC0 = varianceHC0.Select(Math.Sqrt).ToArray();
//            double[] standardErrorsHC1 = varianceHC1.Select(Math.Sqrt).ToArray();

            Assert.Equal(n, generalized.ObservationCount);
            Assert.Equal(k, generalized.VariableCount);
            Assert.Equal(df, generalized.DegreesOfFreedom);

            Assert.Equal(coefficients, generalized.Coefficients, comparer);
//
//            Assert.Equal(varianceOls, generalized.VarianceOls, comparer);
//            Assert.Equal(varianceHC0, generalized.VarianceHC0, comparer);
//            Assert.Equal(varianceHC1, generalized.VarianceHC1, comparer);
//
//            Assert.Equal(standardErrorsOls, generalized.StandardErrorsOls, comparer);
//            Assert.Equal(standardErrorsHC0, generalized.StandardErrorsHC0, comparer);
//            Assert.Equal(standardErrorsHC1, generalized.StandardErrorsHC1, comparer);
        }
        public static void GlmPoisson0()
        {
            UnitTestEqualityComparer comparer = new UnitTestEqualityComparer(8);

            double[][] input =
                GravityCourseData.Select(
                    x => new double[]
            {
                Math.Log(x.Distance),
                x.CommonBorder,
                x.CommonLanguage,
                x.ColonialRelationship
            })
                .ToArray();

            double[] response =
                GravityCourseData.Select(x => x.Trade)
                .ToArray();

            double[] weights =
                Enumerable.Repeat(1.0, response.Length)
                .ToArray();

            GeneralizedLinearModel <double> generalized =
                GeneralizedLinearModel.PoissonRegression(input, response, weights);

            int n  = input.Length;
            int k  = input[0].Length + 1;
            int df = n - k;

            double[] coefficients = new double[] { 14.34011355, -0.77265135, 0.18003745, -0.87616156, -0.07842665 };

            double[] varianceOls = new double[] { 2.47622006e-08, 4.80378670e-10, 5.14379692e-08, 5.98550930e-08, 1.97414603e-07 };
            double[] varianceHC0 = new double[] { 0.01842182, 0.00027302, 0.0054894, 0.00458959, 0.00451205 };
            double[] varianceHC1 = new double[] { 0.01842182, 0.00027302, 0.0054894, 0.00458959, 0.00451205 };

            double[] standardErrorsOls = varianceOls.Select(Math.Sqrt).ToArray();
            double[] standardErrorsHC0 = varianceHC0.Select(Math.Sqrt).ToArray();
            double[] standardErrorsHC1 = varianceHC1.Select(Math.Sqrt).ToArray();

            Assert.Equal(n, generalized.ObservationCount);
            Assert.Equal(k, generalized.VariableCount);
            Assert.Equal(df, generalized.DegreesOfFreedom);

            Assert.Equal(coefficients, generalized.Coefficients, comparer);

            Assert.Equal(varianceOls, generalized.VarianceOls, comparer);
            Assert.Equal(varianceHC0, generalized.VarianceHC0, comparer);
            Assert.Equal(varianceHC1, generalized.VarianceHC1, comparer);

            Assert.Equal(standardErrorsOls, generalized.StandardErrorsOls, comparer);
            Assert.Equal(standardErrorsHC0, generalized.StandardErrorsHC0, comparer);
            Assert.Equal(standardErrorsHC1, generalized.StandardErrorsHC1, comparer);
        }
Esempio n. 3
0
        public static void Main()
        {
            double[][] input =
                GeneralizedLinearModelTests.GravityCourseData
                .Select(
                    x => new double[]
            {
                Math.Log(x.Distance),
                x.CommonBorder,
                x.CommonLanguage,
                x.ColonialRelationship
            })
                .ToArray();

            double[] response =
                GeneralizedLinearModelTests.GravityCourseData
                .Select(x => x.Trade)
                .ToArray();

            double[] weights =
                Enumerable.Repeat(1.0, response.Length)
                .ToArray();

            GeneralizedLinearModel <double> generalized =
                GeneralizedLinearModel.PoissonRegression(input, response, weights);

            const int count = 10;

            IDistribution <double> distribution = new PoissonDistribution(new LogLinkFunction());
            Stopwatch sw = new Stopwatch();

            sw.Start();
            for (int i = 0; i < count; i++)
            {
                generalized = new GeneralizedLinearModel <double>(input, response, weights, distribution, true);
            }
            sw.Stop();
            System.Console.WriteLine(generalized);
            System.Console.WriteLine((double)sw.ElapsedMilliseconds / count);

            ParallelOptions options = new ParallelOptions();

            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                generalized = new GeneralizedLinearModel <double>(input, response, weights, distribution, true, options);
            }
            sw.Stop();
            System.Console.WriteLine(generalized);
            System.Console.WriteLine((double)sw.ElapsedMilliseconds / count);
        }
        public static void GlmPoisson2()
        {
            UnitTestEqualityComparer comparer = new UnitTestEqualityComparer(8);

            double[][] groupMeans =
                GravityCourseData.GroupBy(
                    x => new
            {
                x.Importer,
                x.Exporter,
                x.Year
            })
                .Select(
                    x => new
            {
                x,
                dist  = x.Average(y => y.Distance),
                trade = x.Average(y => y.Trade)
            })
                .Select(
                    x =>
                    x.x.SelectMany(
                        y => new double[]
            {
                x.dist,
                x.trade
            })
                    .ToArray())
                .ToArray();

            double[] grandMeans =
                new double[]
            {
                groupMeans.Average(x => x[0]),
                groupMeans.Average(x => x[1])
            };

            double[][] input =
                GravityCourseData.Select(
                    (x, i) => new double[]
            {
                Math.Log(x.Distance) - Math.Log(groupMeans[i][0]) + Math.Log(grandMeans[0]),
                x.CommonBorder,
                x.CommonLanguage,
                x.ColonialRelationship
            })
                .ToArray();

            double[] response =
                GravityCourseData.Select(
                    (x, i) => x.Trade - groupMeans[i][1] + grandMeans[1])
                .ToArray();

            double[] weights =
                Enumerable.Repeat(1.0, response.Length)
                .ToArray();

            GeneralizedLinearModel <double> generalized =
                GeneralizedLinearModel.PoissonRegression(input, response, weights, new System.Threading.Tasks.ParallelOptions());

            int n  = input.Length;
            int k  = input[0].Length + 1;
            int df = n - k;

            double[] coefficients = new double[] { 13.728590, -0.772651, 0.180037, -0.876162, -0.078427 };
//
//            double[] varianceOls = new double[] { 4.110142e-07, 5.480129e-07, 1.331497e-06 };
//            double[] varianceHC0 = new double[] { 0.005335,  0.011331,  0.028898 };
//            double[] varianceHC1 = new double[] { 0.005335, 0.011331,  0.028898 };
//
//            double[] standardErrorsOls = varianceOls.Select(Math.Sqrt).ToArray();
//            double[] standardErrorsHC0 = varianceHC0.Select(Math.Sqrt).ToArray();
//            double[] standardErrorsHC1 = varianceHC1.Select(Math.Sqrt).ToArray();

            Assert.Equal(n, generalized.ObservationCount);
            Assert.Equal(k, generalized.VariableCount);
            Assert.Equal(df, generalized.DegreesOfFreedom);

            Assert.Equal(coefficients, generalized.Coefficients, comparer);
//
//            Assert.Equal(varianceOls, generalized.VarianceOls, comparer);
//            Assert.Equal(varianceHC0, generalized.VarianceHC0, comparer);
//            Assert.Equal(varianceHC1, generalized.VarianceHC1, comparer);
//
//            Assert.Equal(standardErrorsOls, generalized.StandardErrorsOls, comparer);
//            Assert.Equal(standardErrorsHC0, generalized.StandardErrorsHC0, comparer);
//            Assert.Equal(standardErrorsHC1, generalized.StandardErrorsHC1, comparer);
        }