如何以双射方式对称化[0,1] ^ d中的数据集

时间:2019-01-07 14:15:13

标签: r dataset asymmetric

假设我有一个[0,1] ^ d的数据集,我想在“对称”数据F的重新划分函数应包含以下断言的意义上进行暗示:

例如,如果d = 2,则重新划分函数应在第一个bissectrix周围对称:

应从数据构建转换。如果要使用某些(三变量)数据,可以运行以下R代码(必须首先安装copula软件包):

library(copula)
source(system.file("Rsource", "AC-Liouville.R", package="copula"))
U <- rLiouville(n=1000, alpha=c(1, 10,20), theta=0.6, Rdist="Gamma")
pairs(U)

此外,我希望此变换是双射的,以便可以嵌入拟合。

主要问题如下:我有一个适合对称数据集的算法,我想通过这种转换将其扩展到非对称数据集,以至于我无法正确编写...

想法?谢谢:)

1 个答案:

答案 0 :(得分:2)

我们可以通过对参数的所有排列取平均值来对称化一个函数。尽管该问题要求进行双射变换,但由于投影会丢失信息,因此无法进行双射变换。

此处FunSym输入标量值函数Fun,并输出对称函数。

library(combinat)

FunSym <- function(Fun) {
  function(...) mean(unlist(permn(list(...), do.call, what = Fun)))
}

Fun <- function(x, y) x - y  # test function
FunS <- FunSym(Fun)  # FunS is Fun symmetrized
FunS(1,2) # run FunS for particular arguments
## [1] 0

如果我们知道Fun有2个参数,那么我们可以编写更简单的代码:

FunSym2 <- function(Fun) {
  function(x, y) (Fun(x,y) + Fun(y,x))/2
}

FunS2 <- FunSym2(Fun)  # FunS is Fun symmetrized
FunS2(1,2) # run FunS for particular arguments
## [1] 0

如果Fun是向量值,我们可以像这样修改FunSym

FunSymV <- function(Fun) {
  function(...) rowMeans(simplify2array(permn(list(...), do.call, what = Fun)))
}

# test
FunSymV(Fun)(1:3, 4:6)
## [1] 0 0 0