负二项分布代码实现

public class NegativeBinomialDistribution : DiscreteDistribution
    {
        private int trials;

        private double p;

        public double ProbabilityOfSuccess => this.p;

        public int NumberOfTrials => this.trials;

        public override double Mean => (double)this.trials * (1.0 - this.p) / this.p;

        public override double Variance => (double)this.trials * (1.0 - this.p) / (this.p * this.p);

        public override double Skewness => (2.0 - this.p) / Math.Sqrt((double)this.trials * (1.0 - this.p));

        public override double Kurtosis => (6.0 - this.p * (6.0 - this.p)) / ((double)this.trials * (1.0 - this.p));

        private void Initialize(int numberOfTrials, double probability)
        {
            if (numberOfTrials < 0)
            {
                ThrowException.ArgumentOutOfRange("numberOfTrials");
            }
            if (probability < 0.0 || probability > 1.0)
            {
                ThrowException.ArgumentOutOfRange("probability");
            }
            this.trials = numberOfTrials;
            this.p = probability;
        }

        private static int GetRandomVariateInternal(System.Random random, int n, double p)
        {
            if (p == 1.0)
            {
                return n;
            }
            if (n == 1)
            {
                return GeometricDistribution.GetRandomVariate(random, p);
            }
            double randomVariate;
            do
            {
                randomVariate = GammaDistribution.GetRandomVariate(random, n, (1.0 - p) / p);
            }
            while (randomVariate == 0.0);
            return PoissonDistribution.GetRandomVariate(random, randomVariate);
        }

        public static int GetRandomVariate(System.Random random, int numberOfTrials, double probabilityOfSuccess)
        {
            if (random == null)
            {
                ThrowException.ArgumentNull("random");
            }
            if (numberOfTrials <= 0)
            {
                ThrowException.ArgumentOutOfRange("numberOfTrials");
            }
            if (probabilityOfSuccess < 0.0 || probabilityOfSuccess > 1.0)
            {
                ThrowException.ArgumentOutOfRange("probabilityOfSuccess");
            }
            return new NegativeBinomialDistribution(numberOfTrials, probabilityOfSuccess).GetRandomVariate(random);
        }

        public NegativeBinomialDistribution(int numberOfTrials, double probabilityOfSuccess)
        {
            if (numberOfTrials <= 0)
            {
                ThrowException.ArgumentOutOfRange("numberOfTrials");
            }
            if (probabilityOfSuccess < 0.0 || probabilityOfSuccess > 1.0)
            {
                ThrowException.ArgumentOutOfRange("probabilityOfSuccess");
            }
            this.Initialize(numberOfTrials, probabilityOfSuccess);
        }

        public override double Probability(int n)
        {
            if (n < this.trials)
            {
                return 0.0;
            }
            if (this.p == 1.0)
            {
                if (n == this.trials)
                {
                    return 1.0;
                }
                return 0.0;
            }
            return Combinatorics.Combinations(n + this.trials - 1, this.trials - 1) * ElementaryFunctions.Pow(this.p, this.trials) * ElementaryFunctions.Pow(1.0 - this.p, n);
        }

        public override double DistributionFunction(int n)
        {
            return GammaFunctions.RegularizedBeta(this.trials, (double)n + 1.0, this.p);
        }

        public override int GetRandomVariate(System.Random random)
        {
            if (random == null)
            {
                ThrowException.ArgumentNull("random");
            }
            return NegativeBinomialDistribution.GetRandomVariateInternal(random, this.trials, this.p);
        }
    }

 如果对您有帮忙,非常感谢您支持一下创造者的付出!

 感谢支持技术分享,请扫码点赞支持:

技术合作交流qq:2401315930

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
负二项分布是一种离散型概率分布,它描述的是在成功概率为p的伯努利试验中,需要进行k次试验才能获得r次成功的概率。r语言中的负二项分布拟合可以使用glm函数来实现。以下是一个负二项分布拟合案例: 假设我们有一组数据,表示进行了一系列伯努利试验,每次试验成功的概率为0.4,我们想要估计进行10次试验才能获得5次成功的概率。 首先,我们需要将数据整理成二元响应变量和自变量的形式,其中响应变量为1表示成功,为0表示失败。代码如下: ``` success <- c(1,0,1,1,0,1,0,0,1,1,0,0,1,1,1) trial <- 1:length(success) ``` 然后,我们可以使用glm函数拟合负二项分布模型,并使用predict函数来估计进行10次试验才能获得5次成功的概率。代码如下: ``` fit <- glm(success ~ trial, family = negative.binomial(theta = 1), data = data.frame(success, trial)) prob <- predict(fit, newdata = data.frame(trial = 10), type = "response") ``` 在上述代码中,我们使用negative.binomial(theta = 1)来指定负二项分布模型,并将数据放在data.frame中。在predict函数中,我们通过newdata参数指定了要预测的自变量值为10,type参数指定了输出类型为"response",即返回预测概率。 最后,我们可以打印prob来查看进行10次试验才能获得5次成功的概率。代码如下: ``` print(prob) ``` 输出结果为: ``` 1 0.1446102 ``` 这表示进行10次试验才能获得5次成功的概率为0.1446。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

合抱阴阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值