<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 測試運行 - 使用 C# 執行 t-檢驗 作者?[James McCaffrey](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=James+McCaffrey)?| 2015 年 11 月 | 獲取代碼:?[C#](http://download.microsoft.com/download/B/A/E/BAEA7711-903C-4536-92FF-CAC9955EB848/Code_McCaffrey.TestRun.1115.zip)[VB](http://download.microsoft.com/download/B/A/E/BAEA7711-903C-4536-92FF-CAC9955EB848/VBCode_McCaffrey.TestRun.1115.zip) ![](https://box.kancloud.cn/2016-01-08_568f2a8298186.jpg) t-檢驗是最基本的統計分析形式之一。它目標是當您只有兩個樣本集時,確定兩組數字的均值(平均值)是否相等。通過舉例可以很好地解釋這個原理。假設您要調查一大型學區內高中男生和女生的數學能力。能力測試的成本高昂且非常耗時,所以您不可能對所有學生都進行測試。您可以改為隨機選擇一個包含 10 個男生和 10 個女生的樣本,然后對這些學生進行數學測試。通過樣本結果,您可以執行 t-檢驗,以此來推斷所有男生的真實平均得分是否等于所有女生的真實平均得分。 許多獨立的工具(包括 Excel)都可以執行 t-檢驗。不過,如果您想直接將 t-檢驗功能集成到軟件系統中,那么使用獨立的工具可能并不合適或者根本做不到,并且可能涉及到版權或其他法律問題。本文介紹了如何使用原始(無外部庫)C# 代碼執行 t-檢驗。 若要了解 t-檢驗的定義以及本文要討論的問題,最好的方法是查看圖 1?中的演示程序。第一個數據集是 { 88, 77, 78, 85, 90, 82, 88, 98, 90 }。您可以假設這些數字是 10 個男生的測試得分,其中一個男生由于某種原因沒有參加測試,只剩下九個男生的得分。 ![](https://box.kancloud.cn/2016-01-08_568f30b6333c8.png)? 圖 1:使用 C# 執行 t-檢驗的演示 第二個數據集是 { 81, 72, 67, 81, 71, 70, 82, 81 }。您可以假設這些數字是 10 個女生的測試得分,其中兩個女生由于某種原因沒有參加測試,只剩下八個女生的得分。第一個數據集的平均值是 86.22,第二個數據集的平均值是 75.63。也就是說,兩個群組的平均值不一樣,因為兩者相差接近 11。不過,這兩個群組(所有男生和所有女生)的總平均得分其實是相同的,因為我們只使用了樣本,樣本平均值出現差值可能是偶然事件。 演示程序使用這兩個樣本數據集計算出的“t-統計量” (t) 值為 3.4233,以及“自由度”(通常縮寫為 df,或者通常用希臘小寫字母 nu (ν) 表示)值為 14.937。然后,使用 t 值和 df 值計算出的概率值(p-值)為 0.00379。t-檢驗分為幾種形式。最常見的形式也許是學生 t-檢驗。本演示使用的是經過改進的變體,稱為 Welch t-檢驗。 p-值是指兩個群體(所有男生和所有女生)的真實平均值實際相同的概率,以及鑒于樣本得分,觀察到的差值 11 屬于偶然事件的概率。在此示例中,p-值非常小,所以您可以得出結論,所有男生和所有女生的真實平均值并不相等。在大多數問題中,用于與計算得出的 p-值作對比的臨界 p-值被任意定義為 0.01 或 0.05。 換言之,如果所有男生和所有女生的真實平均得分相同,那么您在兩個樣本(分別包括九個數字和八個數字)的平均值中觀察到接近 11 的差值的概率僅有 0.00379,這種概率是極低的。 要理解本文的內容,您至少需要擁有中級編程技巧,但無需了解 t-檢驗的一切。雖然本演示使用 C# 進行編碼,但您也應該能夠順利地將代碼重構為其他語言(如 Visual Basic、.NET 或 JavaScript)。 ## 理解 t-分布 t-檢驗基于 t-分布。t-分布與正態(也稱為高斯或鐘形)分布密切相關。正態分布數據集的形狀同時取決于數據的均值和標準偏差。標準偏差是衡量數據如何分布和變化的值。一種特殊的情況是,均值(通常用希臘字母 mu (μ) 表示)為 0,標準偏差(英文縮寫通常為 sd,或者通常用希臘字母 sigma (σ) 表示)為 1。我們將均值為 0 且 sd 為 1 的正態分布稱為標準正態分布。圖形如圖 2?所示。 ![](https://box.kancloud.cn/2016-01-08_568f30b670f29.png)? 圖 2:標準正態分布 在圖 2?中,定義標準正態分布的等式被稱為概率密度函數。t-分布與正態分布十分相似。t-分布的形狀取決于一個值,即“自由度”。 df 為 5 時的 t-分布如圖 3?所示。 在圖 3?中,定義 t-分布的等式涉及了 Gamma 函數,通常用希臘大寫字母 gamma (Γ) 表示該函數。為了執行 t-檢驗,您需要對 t-分布曲線下兩個完全相同的面積進行計算和求和。合并面積就是 p-值。例如,在圖 3?中,如果 t 值是 2.0,那么您需要計算曲線下負無窮大到 -2.0 之間,以及 +2.0 到正無窮大之間的合并面積。在此示例中,合并面積(即 p-值)為 0.101939。對于演示程序來說,當 t = 3.4233 時,合并面積為 0.00379。 ![](https://box.kancloud.cn/2016-01-08_568f30b67e9b4.png)? 圖 3:t-分布 那么,該如何計算 t-分布下的面積呢? 雖然解決這個問題的方法有幾種,但最常用的技巧是計算標準正態分布曲線下的一個相關面積,然后用它來計算 p-值。例如,在圖 2?中,如果 z(t 的正態等值)值為 -2.0,則您可以計算從負無窮大到 -2.0 之間的面積,計算結果為 0.02275。然后,您可以使用正態曲線下的這一面積來計算 t-分布下的相應面積。 簡而言之,若要執行 t-檢驗,您必須對 t-分布下的兩個(相等)面積進行計算和求和。我們將這一面積稱為 p-值。為此,您可以計算標準正態分布下的一個面積,然后用此面積計算出 p-值。 ## 計算標準正態分布下的面積 計算標準正態分布曲線下的面積的方法有很多種。這就是計算機科學界最久遠的問題之一。我首選的方法是使用所謂的 ACM 算法 #209。美國計算機協會 (ACM) 已經發布了很多基本算法,用于數值計算和統計計算。 算法 #209 的 C# 實現在圖 4?中呈現為高斯函數。該函數接受介于負無窮大和正無窮大之間的 z 值,并且返回標準正態分布下從負無窮大到 z 的面積的近似值。 圖 4:計算標準正態分布下的面積 ~~~ public static double Gauss(double z) { ? // input = z-value (-inf to +inf) ? // output = p under Standard Normal curve from -inf to z ? // e.g., if z = 0.0, function returns 0.5000 ? // ACM Algorithm #209 ? double y; // 209 scratch variable ? double p; // result. called 'z' in 209 ? double w; // 209 scratch variable ? if (z == 0.0) ??? p = 0.0; ? else ? { ??? y = Math.Abs(z) / 2; ??? if (y >= 3.0) ??? { ????? p = 1.0; ??? } ??? else if (y < 1.0) ??? { ????? w = y * y; ????? p = ((((((((0.000124818987 * w ??????? - 0.001075204047) * w + 0.005198775019) * w ??????? - 0.019198292004) * w + 0.059054035642) * w ??????? - 0.151968751364) * w + 0.319152932694) * w ??????? - 0.531923007300) * w + 0.797884560593) * y * 2.0; ??? } ??? else ??? { ????? y = y - 2.0; ????? p = (((((((((((((-0.000045255659 * y ??????? + 0.000152529290) * y - 0.000019538132) * y ??????? - 0.000676904986) * y + 0.001390604284) * y ??????? - 0.000794620820) * y - 0.002034254874) * y ??????? + 0.006549791214) * y - 0.010557625006) * y ??????? + 0.011630447319) * y - 0.009279453341) * y ??????? + 0.005353579108) * y - 0.002141268741) * y ??????? + 0.000535310849) * y + 0.999936657524; ??? } ? } ? if (z > 0.0) ??? return (p + 1.0) / 2; ? else ??? return (1.0 - p) / 2; } ~~~ 只需快速瀏覽一下圖 4?中的代碼,您就應該確信使用現有算法(如 ACM #209)比您自己從頭開始編碼實現要容易得多。ACM #209 的替代方法是使用稍作修改的 7.1.26 等式,該等式取自 Milton Abramowitz 和 Irene A. Stegun 編寫的“數學函數手冊”(Dover Publications 出版,1965 年)。 ## 計算 t-分布下的面積 在實現了手頭的高斯函數之后,您可以使用 ACM 算法 #395 計算 t-分布下的面積。算法 #395 的 C# 實現在圖 5?中呈現為學生函數。該函數接受 t 值和 df 值,并返回從負無窮大到 t 以及從 t 到正無窮大的合并面積。 圖 5:計算 t-分布下的面積 ~~~ public static double Student(double t, double df) { ? // for large integer df or double df ? // adapted from ACM algorithm 395 ? // returns 2-tail p-value ? double n = df; // to sync with ACM parameter name ? double a, b, y; ? t = t * t; ? y = t / n; ? b = y + 1.0; ? if (y > 1.0E-6) y = Math.Log(b); ? a = n - 0.5; ? b = 48.0 * a * a; ? y = a * y; ? y = (((((-0.4 * y - 3.3) * y - 24.0) * y - 85.5) / ??? (0.8 * y * y + 100.0 + b) + y + 3.0) / b + 1.0) * ??? Math.Sqrt(y); ? return 2.0 * Gauss(-y); // ACM algorithm 209 } ~~~ 算法 #395 有兩種形式。一種形式接受整數值的 df 參數,另一種形式接受雙精度類型值的 df 參數。在大多數統計問題中,自由度是整數值,但 Welch t-檢驗使用雙精度類型值。 ## 演示程序 為了創建演示程序,我啟動了 Visual Studio,并新建了一個名為 TTest 的 C# 控制臺應用程序。此演示并不十分依賴 .NET 版本,因此,任何版本的 Visual Studio 都可以正常運行。在將模板代碼加載到編輯器中之后,我刪除了所有使用的語句,對頂層系統命名空間的單次引用除外。在“解決方案資源管理器”窗口中,我將文件 Program.cs 重命名為 TTestProgram.cs,并允許 Visual Studio 自動為我重命名類 Program。 雖然演示程序有點過長而無法全部展示,但您可以在本文隨附的文件下載中找到完整的源代碼。Main 方法從設置和顯示兩個樣本數據集著手: ~~~ Console.WriteLine("\nBegin Welch's t-test using C# demo\n"); var x = new double[] { 88, 77, 78, 85, 90, 82, 88, 98, 90 }; var y = new double[] { 81, 72, 67, 81, 71, 70, 82, 81 }; Console.WriteLine("\nThe first data set (x) is:\n"); ShowVector(x, 0); Console.WriteLine("\nThe second data set (y) is:\n"); ShowVector(y, 0); ~~~ 所有的工作都由名為 TTest 的方法執行: ~~~ Console.WriteLine("\nStarting Welch's t-test using C#\n"); TTest(x, y); Console.WriteLine("\nEnd t-test demo\n"); Console.ReadLine(); ~~~ 通過對每個數據集中的值進行求和,開始定義 TTest 方法: ~~~ public static void TTest(double[] x, double[] y) { ? double sumX = 0.0; ? double sumY = 0.0; ? for (int i = 0; i < x.Length; ++i) ??? sumX += x[i]; ? for (int i = 0; i < y.Length; ++i) ??? sumY += y[i]; ... ~~~ 接下來,使用這些和來計算兩個樣本的均值: ~~~ int n1 = x.Length; int n2 = y.Length; double meanX = sumX / n1; double meanY = sumY / n2; ~~~ 接下來,使用兩個均值計算兩個樣本的方差: ~~~ double sumXminusMeanSquared = 0.0; // Calculate variances double sumYminusMeanSquared = 0.0; for (int i = 0; i < n1; ++i) ? sumXminusMeanSquared += (x[i] - meanX) * (x[i] - meanX); for (int i = 0; i < n2; ++i) ? sumYminusMeanSquared += (y[i] - meanY) * (y[i] - meanY); double varX = sumXminusMeanSquared / (n1 - 1); double varY = sumYminusMeanSquared / (n2 - 1); ~~~ 數據集的方差是標準偏差的平方,所以標準偏差是方差的平方根,且 t-檢驗支持方差。接下來,計算 t 統計量: ~~~ double top = (meanX - meanY); double bot = Math.Sqrt((varX / n1) + (varY / n2)); double t = top / bot; ~~~ 簡而言之,t 統計量就是用兩個樣本均值之間的差值,除以方差和的平方根,再除以相關的樣本大小。接下來,計算自由度: ~~~ double num = ((varX / n1) + (varY / n2)) * ? ((varX / n1) + (varY / n2)); double denomLeft = ((varX / n1) * (varX / n1)) / (n1 - 1); double denomRight = ((varY / n2) * (varY / n2)) / (n2 - 1); double denom = denomLeft + denomRight; double df = num / denom; ~~~ 計算 Welch t-檢驗的自由度稍微有些棘手,并且等式根本不容易看出來。幸運的是,您永遠無需修改此計算。TTest 方法最后會計算 p-值,并顯示所有計算出的值: ~~~ ... ? double p = Student(t, df); // Cumulative two-tail density ? Console.WriteLine("mean of x = " + meanX.ToString("F2")); ? Console.WriteLine("mean of y = " + meanY.ToString("F2")); ? Console.WriteLine("t = " + t.ToString("F4")); ? Console.WriteLine("df = " + df.ToString("F3")); ? Console.WriteLine("p-value = " + p.ToString("F5")); ? Explain(); } ~~~ 名為 Explain 的由項目定義的方法顯示了對 p-值的解釋,如圖 1?所示。 ## 幾點注釋 涉及到 t-檢驗的統計問題其實分為幾種不同的種類。本文中描述的問題類型有時被稱為未配對 t-檢驗,因為各個樣本數據集的數據值之間沒有概念上的關聯。另一種類型的 t-檢驗稱為配對樣本檢驗。當您擁有某種事前和事后數據(如實施某種指令之前的測試得分,以及隨后實施某種指令之后的測試得分)時,可以使用這種檢驗。在這種情況下,每對得分在概念上是相關的。 在大多數情況下,此處提供的 Welch t-檢驗優于更常見的學生 t-檢驗。學生 t-檢驗通常要求兩個樣本數據集中都擁有等量的數據點,并且要求兩個樣本的方差應大致相等。Welch t-檢驗可以用于樣本大小不等的數據集,即使樣本方差有差異,這種檢驗也很可靠。 本文中介紹的 t-檢驗類型稱為雙尾檢驗。我們差不多可以將其理解為,出現需要確定兩個群組的均值是否相同的問題。如果目標是確定第一組的均值是否大于第二組的均值,則可以使用單尾 t-檢驗。當執行單尾 t-檢驗時,您可以將雙尾 p-值除以 2。 在解釋 t-檢驗的結果時,您應該非常保守。類似“根據計算得出的 t-檢驗 p-值 0.008,我得出結論,男生和女生的真實群體均值不太可能相同”的結論明顯優于“p-值為 0.008 表示男生的平均得分明顯高于女生的平均得分”。 t-檢驗的替代方法稱為 Mann-Whitney U 檢驗。兩種技巧都根據樣本來推斷兩個群體的均值是否相等,但 Mann-Whitney U 檢驗作出的統計假設更少,從而使結論更加保守(您不太可能得出以下結論:調查中的均值不同)。 t-檢驗僅適用于有兩個群組的情況。有關檢查三個或三個以上群組均值的問題,您應該使用 F-檢驗這一分析方法。 * * * Dr.James McCaffrey?*供職于華盛頓地區雷蒙德市沃什灣的 Microsoft Research。他參與過多個 Microsoft 產品的工作,包括 Internet Explorer 和 Bing。Scripto可通過?[jammc@microsoft.com](mailto:jammc@microsoft.com)?與 McCaffrey 取得聯系。*
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看