/// <summary>
        /// 少数のベルヌーイ試行をベータ分布により信頼区間を計算します
        /// </summary>
        /// <param name="successNum">成功数</param>
        /// <param name="sampleNum">サンプル数</param>
        /// <param name="condidenceValue">信頼区間(デフォルトでは0.95)</param>
        /// <returns>信頼区間の推定値</returns>
        public static CInterval ExactConfidenceIntervalBinomial(int successNum, int sampleNum, double condidenceValue = 0.95)
        {
            //参考:http://ynomura.dip.jp/archives/2010/01/18.html

            if (sampleNum == 0)
            {
                throw new DivideByZeroException("sampleNumが0です");
            }
            //信頼度のパラメーター
            var alpha  = 1 - condidenceValue;
            var result = new CInterval();

            result.Upper     = 1 - BetaDistribution.QBeta(alpha / 2, sampleNum - successNum, successNum + 1);
            result.Median    = (double)successNum / (double)sampleNum;
            result.Lower     = 1 - BetaDistribution.QBeta(1 - alpha / 2, sampleNum - successNum + 1, successNum);
            result.SampleNum = sampleNum;

            if (result.Upper == 0.0 && result.Lower == 0.0)
            {
                result.Upper = result.Median;
                result.Lower = result.Median;//近似しきれない場合対策
            }

            return(result);
        }
        /// <summary>
        /// ベルヌーイ試行を正規分布近似した信頼区間を計算します
        /// </summary>
        /// <param name="probSuccess">成功率の推定値</param>
        /// <param name="sampleNum">標本数</param>
        /// <param name="trimExcess">信頼区間を0以下または1以上で打ち切るオプション。デフォルトではオン</param>
        /// <param name="zValue">z値。デフォルトでは95%信頼区間になります</param>
        /// <returns>信頼区間の推定値</returns>
        public static CInterval ConfidenceIntervalBinomial(double probSuccess, int sampleNum, bool trimExcess = true, double zValue = 1.959964)
        {
            if (sampleNum == 0)
            {
                throw new DivideByZeroException("sampleNumが0です");
            }
            //標準誤差
            var sdError = Math.Sqrt(probSuccess * (1 - probSuccess) / (double)sampleNum);
            var upper   = probSuccess + sdError * zValue;
            var lower   = probSuccess - sdError * zValue;
            var median  = probSuccess;

            if (trimExcess)
            {
                upper  = Math.Max(Math.Min(upper, 1.0), 0.0);
                lower  = Math.Max(Math.Min(lower, 1.0), 0.0);
                median = Math.Max(Math.Min(median, 1.0), 0.0);
            }

            var result = new CInterval()
            {
                Lower     = lower,
                Median    = median,
                Upper     = upper,
                SampleNum = sampleNum,
            };

            return(result);
        }
Exemple #3
0
 /// <summary>
 /// Projects this onto the vector provided with the interval on the line returned.
 /// </summary>
 public abstract void Project(C2DVector Vector, CInterval Interval);
Exemple #4
0
 /// <summary>
 /// Projects this onto the line provided with the interval on the line returned.
 /// </summary>
 public abstract void Project(C2DLine Line, CInterval Interval);