2016 年 10 月

第 31 卷,第 10 期

本文章是由機器翻譯。

測試回合 - 使用 C# 的 ANOVA

James McCaffrey

James McCaffrey變異數分析 (ANOVA) 是用來推斷三個或多個群組的方式 (平均) 是否都相等,在只具有範例資料的情況下古典統計資料技術。例如,假設類別共有三個不同的簡介電腦科學大學。每個類別教授的相同老師,但使用不同的教科書和不同教學原理。您想要知道成效是否相同。

您可以評估到 15 個小數位數,在電腦科學能力測驗,但由於測驗是非常昂貴又耗時,您可以提供測驗給每個類別中只有六個隨機選取的學生。您管理測驗,以及執行該範例來推斷是否所有三個類別的方法是相同的或不 ANOVA。

如果您是新手 ANOVA,此技術的名稱可能會稍微造成困擾,因為目標是要分析的資料集。ANOVA 被命名,因為這是因為在幕後分析來表示推斷變異數。

ANOVA 的是了解,並請參閱這篇文章向其中一個好方法是查看示範程式中 [圖 1。示範設定三個群組的硬式編碼分數。請注意,只有四個分數 Group1 和 5 的分數,群組 3 中,是相當常見的範例是不相等,因為測試主題可以中斷或遺失或損毀資料的大小。

使用 C# 範例程式 ANOVA
[圖 1 ANOVA 與 C# 範例程式

有兩個主要步驟 ANOVA。在第一個步驟中,F 統計值和一組稱為 「 自由度 」 (df) 的值被計算使用範例資料。在第二個步驟中,F 和自由度的值用於判斷所有母體擴展的方式都相同 (p 值) 的機率。第一個步驟是相當容易。第二個步驟是很困難。

在示範中,F 的值會是 15.884。一般而言,較大的 F 是,可能性就越小所有母體平均數都相等。我會說明原因 df = 2 (12) 短時間內。使用 F 和 df、 p 值計算為 0.000425。這很小,所以您會認為母體平均數的可能不完全相同。此時,您可以執行其他的統計檢定判斷哪些母體平均數彼此不同。示範資料,它會顯示該 Group1 (樣本平均數 = 4.50) Group2 糟的是 (表示 = 9.67) 和 「 群組 3 (表示 = 10.60)。

示範程式

若要建立示範程式,我啟動 Visual Studio 中,按一下 [檔案 |新 |專案,然後選取 [C# 主控台應用程式] 選項。示範程式有沒有顯著的.NET 相依性,以便能使用任何版本的 Visual Studio。在 [方案總管] 視窗中的範本程式碼載入之後,我以滑鼠右鍵按一下檔案 Program.cs 和重新命名了 AnovaProgram.cs,允許 Visual Studio 會自動重新命名為我的類別程式。

在編輯器視窗的頂端,刪除所有不必要 using 陳述式,讓其中一個最上層系統命名空間的參考。在顯示程式的整體結構 [圖 2。示範程式的整體呈現太長,但完整的範例原始程式碼位於本文所附的下載。

[圖 2 示範程式結構

using System;
namespace Anova
{
  class AnovaProgram
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Begin ANOVA using C# demo");
      // Set up sample data
      // Use data to calculate F and df
      // Use F and df to calculate p-value
      Console.WriteLine("End ANOVA demo");
    }
    static double Fstat(double[][] data, out int[] df) { . . }
    static double LogGamma(double z) { . . }
    static double BetaIncCf(double a, double b, double x) { . . }
    static double BetaInc(double a, double b, double x) { . . }
    static double PF(double a, double b, double x) { . . }
    static double QF(double a, double b, double x) { . . }
    static void ShowData(double[][] data, string[] colNames) { . . }
  }
}

靜態方法 Fstat 計算,並傳回的資料是儲存在陣列的陣列物件 F 統計資料。方法也會計算並傳回兩個 df 值陣列 out 參數中。ShowData 函式會變得要顯示的範例方法的 helper 函式。

其餘的五種方法是計算的 p 值使用。方法 QF 是主要的方法。它會呼叫方法 PF,接著呼叫 BetaInc,接著呼叫 BetaIncCf 和 LogGamma 方法的方法。

在一些初步的 WriteLine 訊息、 Main 方法設定和顯示範例資料︰

double[][] data = new double[3][]; // 3 groups
data[0] = new double[] { 3, 4, 6, 5 };
data[1] = new double[] { 8, 12, 9, 11, 10, 8 };
data[2] = new double[] { 13, 9, 11, 8, 12 };
string[] colNames = new string[] {  "Group1", "Group2", "Group3" };
ShowData(data, colNames);

在非示範案例中,您的資料可能會儲存在文字檔中,您可以撰寫 helper 函式來讀取和將資料載入至陣列的陣列。

系統會計算 F 統計和自由度就像這樣︰

int[] df = null;
double F = Fstat(data, out df);

資料集 df ANOVA,是一組值。第一個值是 K-其中 K 是群組數目,而第二個值是的 1 N-K 其中 N 是範例值的總數。因此示範資料、 df K-1 (N-K) = = (3-1,15-3) = 2 (12)。

P 值會計算並顯示如下︰

double pValue = QF(df[0], df[1], F);
Console.Write("p-value = ");

簡單地說,當執行 ANOVA,呼叫的陳述式是非常簡單。但是還有許多會在幕後執行的工作。

計算 F 統計資料

計算 F 統計值有數個子步驟。假設範例資料值是從示範︰

Group1: 3.00, 4.00, 6.00, 5.00
Group2: 8.00, 12.00, 9.00, 11.00, 10.00, 8.00
Group3: 13.00, 9.00, 11.00, 8.00, 12.00

第一個子步驟是計算每個群組的方法和整體平均值的所有範例值。示範資料︰

means[0] = (3.0 + 4.0 + 6.0 + 5.0) / 4 = 4.50
means[1] = (8.0 + 12.0 + 9.0 + 11.0 + 10.0 + 8.0) / 6 = 9.67
means[2] = (13.0 + 9.0 + 11.0 + 8.0 + 12.0) / 5 = 10.60
gMean = (3.0 + 4.0 + . . . + 12.0) / 15 = 8.60

方法的定義 Fstat 開頭︰

static double Fstat(double[][] data, out int[] df)
{
  int K = data.Length; // Number groups
  int[] n = new int[K]; // Number items each group
  int N = 0; // total number data points
  for (int i = 0; i < K; ++i) {
    n[i] = data[i].Length;
    N += data[i].Length;
  }
...

此時,本機陣列 n 在每個群組中具有值的數目、 K 的群組數目和 N 是所有群組中的值總數。接下來,群組方式計算名為表示一個陣列和整體總計的平均值會計算成變數 gMean:

double[] means = new double[K];
double gMean = 0.0;
for (int i = 0; i < K; ++i) {
  for (int j = 0; j < data[i].Length; ++j) {
    means[i] += data[i][j];
    gMean += data[i][j];
  }
  means[i] /= n[i];
}
gMean /= N;

子下一步是計算 「 群組之間的平方的總和 」 (SSb) 和 「 群組之間的平均平方 」 (MSb)。SSb 是每個群組平均和整體平均值之間的平方差異的加權的總和。MSb = SSb / (K-1) 其中 K 是群組的數目。示範資料︰

SSb = (4 * (4.50 - 8.60)^2) +
 (6 * (9.67 - 8.60)^2) +
 (5 * (10.60 - 8.60)^2) = 94.07
MSb = 94.07 / (3-1) = 47.03

計算 SSb 和 MSb 的程式碼是︰

double SSb = 0.0;
for (int i = 0; i < K; ++i)
  SSb += n[i] * (means[i] - gMean) * (means[i] - gMean);
double MSb = SSb / (K - 1);

子下一步是要計算 」 群組內的平方的總和 」 (SSw) 和 「 群組 (MSw) 內平均平方。SSw 是其群組平均每個取樣值之間的平方總和。MSw = SSw / (N-K)。示範資料︰

SSw = (3.0 - 4.50)^2 + . . + (8.0 - 9.67)^2 +
 . . + (12.0 - 10.60)^2 = 35.53
MSw = 35.53 / (15-3) = 2.96

計算 SSw 和 MSw 的程式碼是︰

double SSw = 0.0;
for (int i = 0; i < K; ++i)
  for (int j = 0; j < data[i].Length; ++j)
    SSw += (data[i][j] - means[i]) * (data[i][j] - means[i]);
double MSw = SSw / (N - K);

最後的子步驟是要計算兩個 df 值及 F 統計資料。兩個 df 值是 K-1 和 N-k。和 F = MSb / MSw。示範資料︰

df = (K-1, N-K) = (3-1, 15-3) = (2, 12)
F = 47.03 / 2.96 = 15.88.

計算自由度及 F 示範程式碼是︰

...
  df = new int[2];
  df[0] = K - 1;
  df[1] = N - K;
  double F = MSb / MSw;
  return F;
} // Fstat

我想您會同意,計算 F 統計和自由度值從一組資料技術,並且會相當容易一旦知道數學方程式。

在計算的 p 值

將 F 統計和自由度值轉換成會告訴您,所有母體平均數都相等產生 F 的範例資料為基礎且 df 是簡單的原則,但實際上很難的機率為 p 值。我會儘量減少與,說明留下極大的需要大量的附加說明的詳細資料。看看圖形中 [圖 3

在計算的 p 值 F 統計和自由度值
[圖 3 計算的 p 值 F 統計和自由度值

每一個配對的自由度值會決定呼叫 F 分佈的圖形。F 分佈的圖形可以變化很大的差異 df 的值。圖形中的 [圖 3 顯示 F 分佈 df = (4,12)。我使用 df = (4,12) 而不是 df = 2 (12) 示範資料因為 df 圖形 = 2 (12) F 分佈是非常典型。

任何 F 分佈的所有區域都是剛好 1.0。如果您知道 F 統計資料的值,p 值會是下 F 分佈從 F 到正無限數的區域。有點困惑,從零到 F 統計 F 分佈下方區域通常稱為 PF,和 F 分佈 F 統計資料從正無限大的值 (代表 p 值) 下的區域通常稱為 QF。因為通訊群組的所有區域都為 1,PF + QF = 1。其實這是比較容易計算 PF 比 QF,因此若要尋找的 p 值 (QF),通常計算 PF 則,減去 1,以取得 QF。

計算 PF 進行困難,但魔法估計方程式幸運的是,已知數十年。找到這些數學方程式和其他人,數百著名的參考,「 手冊的數學函式 」 M.Abramowitz 和 I.A.Stegun。本書通常稱為只是"A (& S) 」 科學程式設計人員。每個 A (& S) 的方程式都有一個 ID 號碼。

在示範中,方法 PF 是其實只是方法 BetaInc 周圍的包裝函式︰

static double PF(double a, double b, double x)
{
  double z = (a * x) / (a * x + b);
  return BetaInc(a / 2, b / 2, z);
}

BetaInc 方法的名稱代表 「 不完整的 Beta 」。 BetaInc 方法會使用 6.6.2 和 26.5.8 A (& S) 方程式。這些方程式呼叫 LogGamma 函式和 BetaIncCf 函式。LogGamma 函式是非常困難,來說明,以及實作。簡單的說,數學 Gamma 函數延伸真實值的數字的階乘的概念。就像階乘,Gamma 函數的值可能變成 astronomically 大,因此處理它們通常會計算 [Gamma 要保留值較小的記錄檔。

計算 LogGamma 是很難處理而有數種演算法,您可以使用。示範程式會使用稱為較 Lanczos 近似值演算法 (g = 5,n = 7)。A (& S) 的參考 」 具有不同的演算法來計算 LogGamma,但 Lanczos 近似值,其無法辨識發行 A (& S) 時,提供更精確的結果。

BetaIncCf 方法的名稱代表 「 不完整 Beta 繼續分數來計算。 」 示範程式會使用的 (& S) 方程式 26.5.8 BetaIncCf 方法。

總結

會做三個數學的假設,ANOVA 測試︰ 群組資料的項目會以數學方式無關。母體擴展的資料集發佈的正常 (如同高斯分佈)。而且母體擴展的資料集具有相等變異數。

有數種方法,您可以測試這些假設,但是解譯其結果具挑戰性。問題是,它不太可能實際資料是完全正常,且擁有完全相同的變異數,不過是有點不正常或具有非相等變異數的資料時,仍能運作 ANOVA。重點是,很難證明 ANOVA 假設,因此您應該會很保守時解譯結果。

ANOVA 與 t 檢定密切相關。T 檢定決定母體擴展的方式兩個群組是否相等,當您具有只是範例資料中。因此,如果您有三個群組,如下所示示範中,而不是使用 ANOVA,您可以理論上執行三種 t 檢定,比較群組 1 和 2、 1 和 3,群組和群組 2 和 3。不過,由於帶來了所謂的類型 1 錯誤 (假象),不建議這種方法。

在本文中說明的 ANOVA 種稱為 ANOVA 單向 (或其中一個因素)。有兩個因素時,會使用不同的技巧,稱為雙向 ANOVA。

ANOVA 為基礎的 F 統計資料集導出值。有其他使用 F 統計資料的統計檢定。例如,您可以使用 F 統計資料來推斷資料的兩個群組的變異數是否相同。


Dr。James McCaffrey 適用於在美國華盛頓州 Redmond 的 Microsoft Research 他曾在數個 Microsoft 產品,包括 Internet Explorer 和 Bing。Dr。可以連線到 McCaffrey jammc@microsoft.com

感謝下列 Microsoft 技術專家檢閱這份文件︰ Chris Lee 和 Kirk Olynk