【问题标题】:R - Calculate difference (similarity measure) between similar datasetsR - 计算相似数据集之间的差异(相似性度量)
【发布时间】:2017-12-08 00:26:15
【问题描述】:

我看到了很多涉及这个主题的问题,但还没有找到答案。如果我错过了一个可以回答这个问题的问题,请标记这个并指出我们的问题。

场景:我们有一个基准数据集,我们有插补方法,我们系统地从基准中删除值并使用两种不同的插补方法。因此我们有一个基准, imputedData1 和 imputedData2。

问题:是否有一个函数可以产生一个数字,该数字表示基准和 imputedData1 之间的差异或/和基准和 imputedData2 之间的差异。即函数(benchmark, imputedData1) = 3.3 和函数(benchmark, imputedData2) = 2.8

注意:数据集是数字的,数据集大小相同,如果可能,方法应该在数据级别上工作(即不创建回归和比较回归 - 除非它可以与任何数字数据集一起工作)。

可重现的数据集,它们只在第一行发生了变化:

基准测试:

> head(mtcars,n=10)
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

估算数据1:

> head(mtcars,n=10)
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         22.0   4 108.0 100 3.90 2.200 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

估算数据2:

> head(mtcars,n=10)
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         18.0   6 112.0 105 3.90 2.620 16.46  0  0    3    4
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

我曾尝试使用 RMSE(均方根误差),但效果不佳,因此我正在尝试寻找其他方法来解决此问题。

【问题讨论】:

  • 由于你的变量有非常不同的范围,我会在运行任何比较之前对它们进行标准化(z 变换):apply(df, 2, scale)。那么您的 RMSE 方法可能会更好。
  • 这是个好主意。我有点不好意思没有考虑。非常感谢!
  • 它可能有效,但如果第二个数据集是第一个数据集的两倍,那么比较将给出零。我认为数据应该根据基准的均值和标准差(对于基准和估算数据)进行居中和减少,然后应用 RMSE。当然,这取决于 OP 所说的“差异”
  • 另一个好点,非常感谢!正如我提到的是对第一个答案的评论,“差异”这个词怎么会造成混淆或模棱两可?
  • 是的,Moody_Mudskipper 当然是对的。根据基准对所有数据集进行标准化。

标签: r machine-learning data-analysis missing-data data-manipulation


【解决方案1】:

您也可以查看包裹ftsa。它有大约20 error measures 可以计算。在您的情况下,缩放误差是有意义的,因为列与列之间的单位不同。

library(ftsa)
error(forecast=unlist(imputedData1),true=unlist(bench), 
          insampletrue = unlist(bench), method = "mase")
[1] 0.035136

error(forecast=unlist(imputedData2),true=unlist(bench), 
          insampletrue = unlist(bench), method = "mase")
[1] 0.031151

数据

bench <- read.table(text='mpg cyl  disp  hp drat    wt  qsec vs am gear carb
21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4',header=TRUE,stringsAsFactors=FALSE)

imputedData1 <- read.table(text='mpg cyl  disp  hp drat    wt  qsec vs am gear carb
22.0   4 108.0 100 3.90 2.200 16.46  0  1    4    4
21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4',header=TRUE,stringsAsFactors=FALSE)

imputedData2 <- read.table(text='mpg cyl  disp  hp drat    wt  qsec vs am gear carb
18.0   6 112.0 105 3.90 2.620 16.46  0  0    3    4
21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4',header=TRUE,stringsAsFactors=FALSE)

【讨论】:

    【解决方案2】:

    一种可能的方法是计算它们的差异的范数,并选择最小化该值的插补方法。不同的目的有不同的矩阵范数。我会将您指向维基百科作为起点 - https://en.wikipedia.org/wiki/Matrix_norm

    在没有关于您的数据的任何细节的情况下,我真的不能说您应该选择哪种方法,但一种方法可能是创建您自己的索引,该索引在不同的矩阵范数之间进行平均,并选择最小化该平均值的插补方法。或者你可以只盯着它们,如果幸运的话,其中一种方法在大多数或所有矩阵规范中都是明显的赢家。

    【讨论】:

    • 谢谢你,我已经考虑过了,但我试图创建一个尽可能自主的系统,所以如果我们需要根据数据集做出选择而系统无法做出选择,这不好。不过,我会进一步调查以确保。一切顺利。
    【解决方案3】:

    cmets 中讨论的内容的简单实现,其结果与 P Lapointe 的答案具有相同数量级,仅供参考。

    library(magrittr)
    center_and_reduce_df <- function(df,bm){
      centered <- mapply('-',df,sapply(bm,mean)) %>% as.data.frame(stringsAsFactors= FALSE)
      reduced <- mapply('/',centered,sapply(bm,sd)) %>% as.data.frame(stringsAsFactors= FALSE)
    }
    mean((center_and_reduce_df(id1,bm) - center_and_reduce_df(bm,bm))^2) # 0.03083166
    

    【讨论】:

    • 非常感谢,我要进行一些测试!
    【解决方案4】:

    不太清楚您所说的“差异”是什么意思,但如果您只想知道每个单元格与每个单元格的平均差异有多大(假设矩阵具有相同的形状并且具有相同的列/行),您可以做绝对差异,或使用欧几里得距离,或 Kolmogorov-Smirnov 距离 - 再次取决于您所说的“差异”。

    abs(head(mtcars) - (head(mtcars)*0.5)) # differences by cell
    mean( as.matrix(abs(head(mtcars) - (head(mtcars)*0.5)))) # mean abs difference
    dist( t(data.frame(as.vector(as.matrix(head(mtcars))), (as.vector(as.matrix(head(mtcars)*0.5)))))) # Euclidean; remove t() to see element by element
    ks.test( as.vector(as.matrix(head(mtcars))), (as.vector(as.matrix(head(mtcars)*0.5))))$statistic  # K-S
    

    【讨论】:

    • 我会试试这个,谢谢你的意见!只是出于兴趣,在我为寻找答案而阅读的所有类似类型的问题中,总有一些 cmets 与“差异”的概念作斗争。想知道为什么您不确定我的意思,是否存在不同类型的“差异”?一切顺利。
    • @abdnChap 好吧,我刚刚给了你 3 种不同的衡量标准,它们都可以称为不同的类型,另外 2 个答案提供了进一步的解释......
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2017-08-22
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多