R-计算相似数据集之间的差异(相似性度量)
我已经看到很多关于这个话题的问题,但还没有找到答案。如果我遗漏了一个回答这个问题的问题,请做标记并指出问题所在 场景:我们有一个基准数据集,我们有插补方法,我们系统地从基准中删除值,并使用两种不同的插补方法。因此,我们有一个基准,插补数据1和插补数据2 问题:是否有一个函数可以生成一个数字,表示基准和插补数据1之间的差异或/和基准和插补数据2之间的差异。Ie函数(基准,插补数据1)=3.3,函数(基准,插补数据2)=2.8 注:数据集是数字的,数据集大小相同,如果可能,方法应在数据级别工作(即不创建回归和比较回归-除非它可以与任何数字数据集一起工作) 可复制数据集,仅在第一行中更改: 基准: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 注:数据集是数字的,数据集大小相同,如果可能,方法应在数据级别工作(即不
> 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