R-计算相似数据集之间的差异(相似性度量)

R-计算相似数据集之间的差异(相似性度量),r,machine-learning,data-analysis,missing-data,data-manipulation,R,Machine Learning,Data Analysis,Missing Data,Data Manipulation,我已经看到很多关于这个话题的问题,但还没有找到答案。如果我遗漏了一个回答这个问题的问题,请做标记并指出问题所在 场景:我们有一个基准数据集,我们有插补方法,我们系统地从基准中删除值,并使用两种不同的插补方法。因此,我们有一个基准,插补数据1和插补数据2 问题:是否有一个函数可以生成一个数字,表示基准和插补数据1之间的差异或/和基准和插补数据2之间的差异。Ie函数(基准,插补数据1)=3.3,函数(基准,插补数据2)=2.8 注:数据集是数字的,数据集大小相同,如果可能,方法应在数据级别工作(即不

我已经看到很多关于这个话题的问题,但还没有找到答案。如果我遗漏了一个回答这个问题的问题,请做标记并指出问题所在

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

问题:是否有一个函数可以生成一个数字,表示基准和插补数据1之间的差异或/和基准和插补数据2之间的差异。Ie函数(基准,插补数据1)=3.3,函数(基准,插补数据2)=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(均方根误差),但效果不太好,所以我正在尝试寻找其他方法来解决这个问题

不太清楚“差异”是什么意思,但如果您只想知道每个单元格与每个单元格的平均差异有多大(假设矩阵的形状相同且具有相同的列/列),您可以进行绝对差异,或者使用欧几里德距离或柯尔莫哥洛夫-斯米尔诺夫距离-这取决于您所说的“差异”的含义


一种可能的方法是计算其差异的范数,并选择使该值最小化的插补方法。有不同的矩阵规范用于不同的目的。我将向您介绍维基百科作为起点-


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

您也可以查看软件包
ftsa
。它有大约可以计算的。在您的情况下,缩放错误是有意义的,因为每列的单位不同

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)

bench评论中讨论的内容的简单实现,给出的结果与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
库(magrittr)

由于变量的范围非常不同,所以在运行任何比较之前,我会对它们进行标准化(z变换):
apply(df,2,scale)
。那么您的RMSE方法可能会更好。这是一个非常好的主意。我没有考虑到这一点有点尴尬。非常感谢!这可能有效,但如果第二个数据集是第一个数据集的两倍,则比较结果将为零。我认为数据应该集中,并根据基准的平均值和sd(对于基准和插补数据)进行缩减,然后应用RMSE。当然,这取决于OP所说的“差异”另一个优点,非常感谢!正如我提到的,是对第一个答案的评论,为什么“差异”一词会造成混乱或歧义?是的,穆迪·穆德斯基普当然是对的。根据基准标准化所有数据集。我将尝试一下,谢谢您的输入!只是出于兴趣,在我读过的寻找答案的所有类似类型的问题中,总有一些评论与“差异”的概念抗争。想知道为什么你不确定我的意思,是不是有不同类型的“差异”?祝你一切顺利。@abdnChap好吧,我刚才给了你3种不同的衡量标准,它们都可以称为不同的类别,另外两个答案提供了进一步的解释……非常感谢,我要进行一些测试!谢谢你,我已经考虑过了,但我试图创建一个尽可能自治的系统,因此如果我们需要根据数据集做出选择,而系统无法做出选择,那是没有好处的。不过,我会进一步调查以确定。祝你一切顺利。
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