Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext
計算二項分佈發生頻率( Frequency of Occurrence for)的置信界限( Confidence Limits)

設想你有一個遵循二項分佈(Binomial Distribution)的過程(Process):對於每次試驗,一個事件要出現,要麼不出現,稱作「成功」和「失敗」。如果,通過實驗,你想測量「成功」的發生頻率,對於在N次試驗中有k 次成功的最好的估計是k / N。然而,我們的信心將會被試驗的次數,以及發生多少次成功試驗所左右。靜態成員函數:binomial_distribution<>::find_lower_bound_on_p and binomial_distribution<>::find_upper_bound_on_p

允許你計算發生頻率(occurrence frequency)的置信區間(confidence intervals)。

例子程序binomial_confidence_limits.cpp 舉例說明了它們的使用方法。 例子程序通過定義一個打印對於不同的必然係數(degrees of certainty)的置信界限(confidence limit)的表格的函數開始:

#include <iostream>
#include <iomanip>
#include <boost/math/distributions/binomial.hpp>

void confidence_limits_on_frequency(unsigned trials, unsigned successes)
{
   //
   // trials = 總的試驗次數.
   // successes = 總的成功事件的次數.
   //
   // 計算一個遵循二項分佈的事件出現
   // 頻率的置信界限
   //
   using namespace std;
   using namespace boost::math;

   // 打印基本信息:
   cout <<
      "___________________________________________\n"
      "2-Sided Confidence Limits For Success Ratio\n"
      "___________________________________________\n\n";
   cout << setprecision(7);
   cout << setw(40) << left << "Number of Observations" << "=  " << trials << "\n";
   cout << setw(40) << left << "Number of successes" << "=  " << successes << "\n";
   cout << setw(40) << left << "Sample frequency of occurrence" << "=  " << double(successes) / trials << "\n";

現在這個函數定義了一個顯著性水平表(table of significance levels): 這些概率是真實的發生頻率位於計算區間之外的概率:

double alpha[] = { 0.5, 0.25, 0.1, 0.05, 0.01, 0.001, 0.0001, 0.00001 };

打印漂亮的表頭信息:

cout << "\n\n"
        "_______________________________________________________________________\n"
        "Confidence        Lower CP       Upper CP       Lower JP       Upper JP\n"
        " Value (%)        Limit          Limit          Limit          Limit\n"
        "_______________________________________________________________________\n";

現在,對於重要的部分 - 區間本身 -對於每個值alpha, 我們調用函數 find_lower_bound_on_p 以及函數find_lower_upper_on_p 來分別獲得下界和上界。注意:因為我們計算一個兩側區間(two-sided interval),我們必須將 alpha 的值除以2。

請注意:計算兩個單獨的單側邊界區間(single sided bounds), 每一個的風險水平(risk level)為 α 與計算一個雙側區間(two-sided interval)是不同的。當我們已經計算了兩個單側區間(single-sided interval),真值(true value)在這兩個區間之外的概率風險(risk)為α,那麼:

真值(true value)比下邊界(lower bound)小的風險(risk)為 α。

所以真值(true value)超出上邊界或下邊界 的風險(risk)是兩倍 alpha,因此真值(true value)在這個範圍之內的概率並不是與某人想的一樣高。這就是為什麼在下面的計算中要使用α/2。

相反,我們已經計算了一個單側區間(single-sided interval),例如:"計算一個下邊界使得我們有P% 的把握真實的發生頻率大於某個值" ,那麼不需要 除以2.

最後,注意:binomial_distribution 為這種計算提供了兩種方法作為選擇,在這個例子中,我們使用兩種方法來打印結果:

   for(unsigned i = 0; i < sizeof(alpha)/sizeof(alpha[0]); ++i)
   {
      // Confidence value:
      cout << fixed << setprecision(3) << setw(10) << right << 100 * (1-alpha[i]);
      // 計算 Clopper Pearson 界限:
      double l = binomial_distribution<>::find_lower_bound_on_p(
                     trials, successes, alpha[i]/2);
      double u = binomial_distribution<>::find_upper_bound_on_p(
                     trials, successes, alpha[i]/2);
      // 打印 Clopper Pearson 界限:
      cout << fixed << setprecision(5) << setw(15) << right << l;
      cout << fixed << setprecision(5) << setw(15) << right << u;
      // 計算 Jeffreys Prior 界限:
      l = binomial_distribution<>::find_lower_bound_on_p(
            trials, successes, alpha[i]/2, 
            binomial_distribution<>::jeffreys_prior_interval);
      u = binomial_distribution<>::find_upper_bound_on_p(
            trials, successes, alpha[i]/2, 
            binomial_distribution<>::jeffreys_prior_interval);
      // 打印 Jeffreys Prior 界限:
      cout << fixed << setprecision(5) << setw(15) << right << l;
      cout << fixed << setprecision(5) << setw(15) << right << u << std::endl;
   }
   cout << endl;
}

這就是所有需要做的,讓我看一下從2到10的成功比(success ratio)的一些樣本輸出,首先對於20次試驗:

___________________________________________
2-Sided Confidence Limits For Success Ratio
___________________________________________

Number of Observations                  =  20
Number of successes                     =  4
Sample frequency of occurrence          =  0.2


_______________________________________________________________________
Confidence        Lower CP       Upper CP       Lower JP       Upper JP
 Value (%)        Limit          Limit          Limit          Limit
_______________________________________________________________________
    50.000        0.12840        0.29588        0.14974        0.26916
    75.000        0.09775        0.34633        0.11653        0.31861
    90.000        0.07135        0.40103        0.08734        0.37274
    95.000        0.05733        0.43661        0.07152        0.40823
    99.000        0.03576        0.50661        0.04655        0.47859
    99.900        0.01905        0.58632        0.02634        0.55960
    99.990        0.01042        0.64997        0.01530        0.62495
    99.999        0.00577        0.70216        0.00901        0.67897

就如你所看到的那樣,即使是在95% 的置信水平(confidence level),範圍也是相當的寬 (選擇這個例子來與NIST/SEMATECH e-Handbook of Statistical Methods. here進行比較)。注意: Clopper-Pearson 計算方法 (上面的 CP ) 產生的結果與 Jeffreys Prior 方法產生的結果顯然更悲觀(pessimistic)一些 (上面的JP)。

與2000次試驗的輸出進行比較:

___________________________________________
2-Sided Confidence Limits For Success Ratio
___________________________________________

Number of Observations                  =  2000
Number of successes                     =  400
Sample frequency of occurrence          =  0.2000000


_______________________________________________________________________
Confidence        Lower CP       Upper CP       Lower JP       Upper JP
 Value (%)        Limit          Limit          Limit          Limit
_______________________________________________________________________
    50.000        0.19382        0.20638        0.19406        0.20613
    75.000        0.18965        0.21072        0.18990        0.21047
    90.000        0.18537        0.21528        0.18561        0.21503
    95.000        0.18267        0.21821        0.18291        0.21796
    99.000        0.17745        0.22400        0.17769        0.22374
    99.900        0.17150        0.23079        0.17173        0.23053
    99.990        0.16658        0.23657        0.16681        0.23631
    99.999        0.16233        0.24169        0.16256        0.24143

現在,即使置信水平(confidence level)很高,界限與實驗計算值0.2是非常接近的。更進一步,兩種算法之間的區別也更小了。.


PrevUpHomeNext