C#,数值计算——t-分布(Student distribution)的计算方法与源程序

在概率论和统计学中,学生t-分布(Student's t-distribution)经常应用在对呈正态分布的总体的均值进行估计。它是对两个样本均值差异进行显著性测试的学生t测定的基础。t检定改进了Z检定(en:Z-test),不论样本数量大或小皆可应用。在样本数量大(超过120等)时,可以应用Z检定,但Z检定用在小的样本会产生很大的误差,因此样本很小的情况下得改用学生t检定。在数据有三组以上时,因为误差无法压低,此时可以用变异数分析代替学生t检定。
当母群体的标准差是未知的但却又需要估计时,我们可以运用学生t-分布。
学生t-分布可简称为t分布。其推导由威廉·戈塞于1908年首先发表,当时他还在都柏林的健力士酿酒厂工作。因为不能以他本人的名义发表,所以论文使用了学生(Student)这一笔名。之后t检验以及相关理论经由罗纳德·费雪的工作发扬光大,而正是他将此分布称为学生分布。
 

在概率论和统计学中,t-分布(t-distribution)用于根据小样本来估计呈正态分布且方差未知的总体的均值。如果总体方差已知(例如在样本数量足够多时),则应该用正态分布来估计总体均值。
t分布曲线形态与n(确切地说与自由度df)大小有关。与标准正态分布曲线相比,自由度df越小,t分布曲线愈平坦,曲线中间愈低,曲线双侧尾部翘得愈高;自由度df愈大,t分布曲线愈接近正态分布曲线,当自由度df=∞时,t分布曲线为标准正态分布曲线。

using System;

namespace Legalsoft.Truffer
{
    public class Studenttdist : Beta
    {
        private double nu { get; set; }
        private double mu { get; set; }
        private double sig { get; set; }
        private double np { get; set; }
        private double fac { get; set; }

        public Studenttdist(double nnu, double mmu = 0.0, double ssig = 1.0)
        {
            this.nu = nnu;
            this.mu = mmu;
            this.sig = ssig;
            if (sig <= 0.0 || nu <= 0.0)
            {
                throw new Exception("bad sig,nu in Studentdist");
            }
            np = 0.5 * (nu + 1.0);
            fac = Globals.gammln(np) - Globals.gammln(0.5 * nu);
        }
        public double p(double t)
        {
            return Math.Exp(-np * Math.Log(1.0 + Globals.SQR((t - mu) / sig) / nu) + fac) / (Math.Sqrt(3.14159265358979324 * nu) * sig);
        }
        public double cdf(double t)
        {
            double p = 0.5 * betai(0.5 * nu, 0.5, nu / (nu + Globals.SQR((t - mu) / sig)));
            if (t >= mu)
            {
                return 1.0 - p;
            }
            else
            {
                return p;
            }
        }
        public double invcdf(double p)
        {
            if (p <= 0.0 || p >= 1.0)
            {
                throw new Exception("bad p in Studentdist");
            }
            double x = invbetai(2.0 * Math.Min(p, 1.0 - p), 0.5 * nu, 0.5);
            x = sig * Math.Sqrt(nu * (1.0 - x) / x);
            return (p >= 0.5 ? mu + x : mu - x);
        }
        public double aa(double t)
        {
            if (t < 0.0)
            {
                throw new Exception("bad t in Studentdist");
            }
            return 1.0 - betai(0.5 * nu, 0.5, nu / (nu + Globals.SQR(t)));
        }
        public double invaa(double p)
        {
            if (p < 0.0 || p >= 1.0)
            {
                throw new Exception("bad p in Studentdist");
            }
            double x = invbetai(1.0 - p, 0.5 * nu, 0.5);
            return Math.Sqrt(nu * (1.0 - x) / x);
        }
    }
}
 

猜你喜欢

转载自blog.csdn.net/beijinghorn/article/details/131988650