好的,我已经广泛修改了这个答案。我认为,与其将您的数据进行分箱并比较每个箱中的计数,不如将我的建议隐藏在最初的答案中,即拟合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数据的生成方式,大小的不同等等。
希望能有所帮助。