Goodness-of-Fit

二維直方圖的擬合優度

  • April 5, 2012

我有兩組代表恆星參數的數據:觀察到的一組和建模的一組。通過這些集合,我創建了所謂的雙色圖 (TCD)。可以在這裡看到一個示例:

直方圖

A是觀察到的數據,B是從模型中提取的數據(別管黑線,點代表數據)我只有一個A圖,但可以根據需要生成任意多個不同的B圖,我需要的是保留最適合A的那個。

所以我需要一種可靠的方法來檢查圖B(模型)與圖A(觀察到的)的擬合優度。

現在我要做的是通過對兩個軸進行分箱(每個軸 100 個箱)為每個圖表創建一個 2D 直方圖或網格(這就是我所說的,也許它有一個更合適的名稱)然後我遍歷網格的每個單元格我發現該特定單元格的 AB之間的計數絕對差異。在遍歷所有單元格之後,我將每個單元格的值相加,因此我最終得到一個表示擬合優度的正參數() 在AB之間。越接近零,擬合越好。基本上,這就是該參數的樣子:

; 在哪裡是圖表A中該特定單元格的星數(由) 和是B的數字。

這就是那些每個單元格中的計數差異看起來像我創建的網格(請注意,我沒有使用在這張圖片中,但我計算範圍):

赫斯

問題是我被告知這可能不是一個好的估計器,主要是因為除了說這個擬合比另一個擬合更好,因為參數較低,我真的不能再說什麼了。


重要

(感謝@PeterEllis 提出這個問題)

1- B中的點與****A中的點不是一一對應的。這是在尋找最佳擬合時要記住的重要一點: AB中的點數不一定相同,擬合優度測試也應該考慮這種差異並儘量減少它。

2-我嘗試擬合到A的每個B數據集(模型輸出)中的點數固定。


我見過在某些情況下使用卡方檢驗:

; 在哪裡是觀察到的頻率(模型)和是預期頻率(觀察)。

但問題是:如果是零?如上圖所示,如果我在該範圍內創建這些圖表的網格,將會有很多單元格為零。

另外,我讀過一些人建議在涉及直方圖的情況下應用對**數似然泊松檢驗。如果這是正確的,如果有人可以指導我如何使用該測試來解決這個特殊情況,我將非常感激(請記住,我的統計知識很差,所以請盡可能簡單:)

好的,我已經廣泛修改了這個答案。我認為,與其對您的數據進行分箱並比較每個箱中的計數,不如在我原來的答案中提出的建議,即擬合二維內核密度估計並比較它們是一個更好的主意。更好的是,在 Tarn Duong 的R ks 包中有一個函數 kde.test()可以輕鬆完成這項工作。

查看 kde.test 的文檔以獲取更多詳細信息以及您可以調整的參數。但基本上它幾乎完全符合您的要求。它返回的 p 值是在零假設下生成您正在比較的兩組數據的概率,即它們是從同一分佈中生成的。所以 p 值越高,A 和 B 之間的擬合越好。參見下面的示例,這很容易發現 B1 和 A 不同,但 B2 和 A 似乎是相同的(這就是它們的生成方式) .

# generate some data that at least looks a bit similar
generate <- function(n, displ=1, perturb=1){
   BV <- rnorm(n, 1*displ, 0.4*perturb)
   UB <- -2*displ + BV + exp(rnorm(n,0,.3*perturb))
   data.frame(BV, UB)
}
set.seed(100)
A <- generate(300)
B1 <- generate(500, 0.9, 1.2)
B2 <- generate(100, 1, 1)
AandB <- rbind(A,B1, B2)
AandB$type <- rep(c("A", "B1", "B2"), c(300,500,100))

# plot
p <- ggplot(AandB, aes(x=BV, y=UB)) + facet_grid(~type) + 
   geom_smooth() +     scale_y_reverse() + theme_grey(9)
win.graph(7,3)
p +geom_point(size=.7)

在此處輸入圖像描述

> library(ks)
> kde.test(x1=as.matrix(A), x2=as.matrix(B1))$pvalue
[1] 2.213532e-05
> kde.test(x1=as.matrix(A), x2=as.matrix(B2))$pvalue
[1] 0.5769637

我在下面的原始答案僅保留,因為現在有來自其他地方的鏈接,這些鏈接沒有意義

首先,可能有其他方法可以解決這個問題。

Justel 等人提出了 Kolmogorov-Smirnov 擬合優度檢驗的多元擴展,我認為可以在您的案例中使用它,以測試每組建模數據與原始數據的擬合程度。我找不到這個的實現(例如在 R 中),但也許我看起來不夠努力。

或者,可能有一種方法可以通過將copula擬合到原始數據和每組建模數據,然後比較這些模型來做到這一點。在 R 和其他地方有這種方法的實現,但我對它們不是特別熟悉,所以沒有嘗試過。

但是要直接解決您的問題,您採取的方法是合理的。有幾點建議自己:

  • 除非您的數據集比看起來要大,否則我認為 100 x 100 的網格太多了。直觀地說,我可以想像您得出的結論是各種數據集比它們更加不同,這僅僅是因為您的 bin 的精度意味著您有很多 bin 中的點數很少,即使數據密度很高。然而,這最終是一個判斷的問題。我當然會用不同的分箱方法檢查你的結果。
  • 完成分箱並將數據轉換為(實際上)具有兩列且行數等於分箱數(在您的情況下為 10,000)的計數列聯表後,您就有一個比較兩列的標準問題的計數。卡方檢驗或擬合某種泊松模型都可以,但正如您所說,由於大量的零計數存在尷尬。這些模型中的任何一個通常都是通過最小化差異的平方和來擬合的,由預期計數的倒數加權;當這接近零時,可能會導致問題。

編輯 - 這個答案的其餘部分我現在不再認為是一種合適的方法。

我認為 Fisher 的精確檢驗在這種情況下可能沒有用或不合適,因為交叉表中行的邊際總數不固定。它會給出一個似是而非的答案,但我發現很難將其使用與實驗設計的原始推導相協調。我將原始答案留在這裡,因此評論和後續問題是有意義的。另外,可能仍然有一種方法可以回答 OP 對數據進行分箱的所需方法,並通過基於平均絕對值或平方差的一些測試來比較這些分箱。這種方法仍將使用下面提到的交叉表並測試獨立性,即尋找 A 列與 B 列具有相同比例的結果。

我懷疑上述問題的解決方案是使用Fisher 精確檢驗,將其應用於您的交叉表,其中是 bin 的總數。雖然由於表中的行數,完整的計算不太可能是實際的,但您可以使用蒙特卡羅模擬獲得對 p 值的良好估計(Fisher 檢驗的 R 實現將此作為表的選項大於 2 x 2,我懷疑其他包也是如此)。這些 p 值是第二組數據(來自您的一個模型)在您的 bin 中與原始數據具有相同分佈的概率。因此,p 值越高,擬合越好。

我模擬了一些數據看起來有點像你的,發現這種方法非常有效地識別我的“B”組數據中的哪些是從與“A”相同的過程中生成的,哪些略有不同。肯定比肉眼更有效。

  • 用這種方法測試變量的獨立性列聯表,A中的點數與B中的點數不同並不重要(儘管注意它如果您按照最初的建議僅使用絕對差或平方差的總和,則會出現問題)。但是,您的每個版本的 B 具有不同數量的點確實很重要。基本上,較大的 B 數據集將傾向於返回較低的 p 值。我可以想到幾個可能的解決方案來解決這個問題。1. 您可以通過從大於該大小的所有 B 個集合中抽取該大小的隨機樣本,將所有 B 個數據集減少到相同大小(B 個集合中最小的大小)。2. 您可以首先為每個 B 組擬合一個二維核密度估計,然後從該估計中模擬大小相等的數據。3.您可以使用某種模擬來計算p值與大小的關係並使用它來“糾正” 您從上述過程中獲得的 p 值,因此它們具有可比性。可能還有其他選擇。你做哪一個將取決於 B 數據是如何生成的,大小有多麼不同等。

希望有幫助。

引用自:https://stats.stackexchange.com/questions/25946

comments powered by Disqus