2D直方图的拟合优度


19

我有两组代表恒星参数的数据:一个观测数据和一个模拟数据。通过这些设置,我创建了所谓的双色图(TCD)。可以在此处查看示例:

直方图

A是观察到的数据,B是从模型中提取的数据(不要在意黑线,点代表数据),我只有一个A图,但可以根据需要生成任意多的B图,而我需要的是保持最适合A的那个。

因此,我需要一种可靠的方法来检查图B(模型)与图A(已观察)的拟合度。

现在,我要做的是通过对两个轴进行装箱(每个箱装100个箱)为每个图创建一个2D直方图或网格(这就是我所说的,也许它有一个更合适的名称),然后遍历栅格的每个单元格我发现该特定单元格的AB之间计数的绝对差异。在遍历所有单元格之后,我对每个单元格的值求和,因此最终得到一个单个正参数,表示AB之间的拟合优度(g f)。越接近零,拟合越好。基本上,这就是该参数的样子:GF

; 其中 a i j是图A中该特定像元的恒星数目(由 i j确定),而 b i jB的数目。GF=一世Ĵ|一种一世Ĵ-b一世Ĵ|一种一世Ĵ一世Ĵb一世Ĵ

这就是我创建的网格中每个单元格中的那些计数差异(请注意,在此图像中我没有使用a i jb i j)的绝对值,但是我在计算g f参数时确实使用了它们):一种一世Ĵ-b一世Ĵ一种一世Ĵ-b一世ĴGF

赫斯

问题是,有人告诉我这可能不是一个很好的估计器,主要是因为除了因为参数较低之外,说此拟合比另一个拟合更好之外,我真的不能多说。


重要事项

(感谢@PeterEllis提出来)

在1-积分是不相关的一对一与点。这是要记住的最合适的搜索时,一个重要的事情:在点数一个不是一定相同和拟合优度测试还应该考虑这种差异,并尽量减少它。

2-点的每一个的数目数据集(模型输出)我尝试适合固定的。


我看过在某些情况下使用的Chi-Squared测试:

一世Ø一世-Ë一世2/Ë一世Ø一世Ë一世

Ë一世Ë一世

另外,我已经阅读一些人推荐的对数似然泊松检验,适用于涉及直方图的此类情况。如果这是正确的我真的很感激,如果有人可以教我如何使用测试,以这种特殊情况下(请记住,我统计的知识是非常不好的,所以请保持它的简单,你可以:)


B中的点与A中的点是否具有一一对应的关系(例如每个点都是特定的恒星),还是比它更抽象?
彼得·埃利斯

嗨@PeterEllis,在没有点不涉及一个对一个在点。其实这是要记住的最合适的搜索时,另一个重要的事情:在点数一个不是一定相等。
加百利

嗨-有趣的问题,我会尝试写一个正确的答案。B的每个版本是相同的点数,还是它们也有所不同?
彼得·埃利斯

它们也变化,只有A中的点数保持不变。您不知道如果您帮我弄清楚@PeterEllis,您将为我提供多少帮助。
加百利

这个问题与这个主题非常相似:stats.stackexchange.com/questions/71036/…我在此处提供了答案。
L Fischman '18

Answers:


14

好的,我已经广泛修改了这个答案。我认为,与其将您的数据进行分箱并比较每个箱中的计数,不如将我的建议隐藏在最初的答案中,即拟合2d内核密度估计并进行比较是一个更好的主意。更好的是,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的网格太多了。凭直觉,我可以想象您得出的结论是,由于仓位的精确度,得出的各种数据集比它们更相异,即使数据密度很高,也意味着您有很多仓位中点数少。但是,最终这是一个判断问题。我当然会用不同的分箱方法检查您的结果。

  • 一旦完成分箱并将数据转换为(实际上)具有两列且行数等于箱数(在您的情况下为10,000)的列联表,则存在比较两列的标准问题数。卡方检验或拟合某种泊松模型都可以,但是正如您所说的那样,由于存在大量的零计数,因此很尴尬。这些模型中的任何一个通常都可以通过将差异的平方和最小化(以预期计数的倒数加权)来拟合;当该值接近零时,可能会引起问题。

编辑-此答案的其余部分我现在不再认为是适当的方法。

ñG×2

ñG×2ñG

我对一些数据进行了模拟,看起来有点像您的数据,发现这种方法非常有效地识别了我的“ B”组数据中的哪些是与“ A”相同的过程生成的,而哪些略有不同。肯定比肉眼更有效。

  • ñG×2如果您仅使用最初提出的绝对差或平方差之和,就会出现问题。但是,B的每个版本都有不同数量的点确实很重要。基本上,较大的B数据集将倾向于返回较低的p值。我可以想到几种解决该问题的方法。1.您可以通过从所有大于该大小的B组中随机抽取该大小的样本,来将所有B组数据减少为相同大小(B组中最小的一组的大小)。2.您可以首先将二维核密度估计值适合每个B集,然后根据该估计值模拟大小相等的数据。3.您可以使用某种模拟方法来计算p值与大小的关系,并使用它来“校正” 您从上述过程中获得的p值具有可比性。可能还有其他选择。您将执行哪一项取决于B数据的生成方式,大小的不同等等。

希望能有所帮助。


我做了一些小的错字更正;我希望你不要介意。可能存在一种格式化事情的方法,以使主要思想更加突出,尤其是在最后一个要点。但是,我也不想太过热情。干杯。:)
红衣主教2012年

没有问题。我想办法格式化最后一个项目符号点-我想要的是项目符号点下的编号列表层次结构。但是我找不到怎么做。
彼得·埃利斯

是的,我也简短地摆弄了一下,因为这就是您想要的样子。我无法快速弄清楚该怎么做,并且非常犹豫要对布局进行全面更改,因此我认为我只想发表评论。:)
红衣主教

1
我推荐Wilcox的书作为使用R的一般统计文本(请参阅我的回答stats.stackexchange.com/questions/25632/…)。尽管他没有掩盖Fisher的确切内容,但网络上的特定文本有足够的细节,如果您在那本书中有类似测试的背景知识,这将更加有意义。关于拟合优度的特定问题可能会有更好的论述,但我认为Wilcox的书作为一般性介绍非常好,可以快速将您带入高水平。
彼得·埃利斯

1
哇。您从这件事中得到了解答。如果有“最好的stackexchange”,那就在其中。
科林K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.