生成多维数据

Pra*_*eep 14 r shapes multidimensional-array

R有一个用于在多维空间中生成随机数的包吗?例如,假设我想在长方体或球体内生成1000个点.

Jor*_*eys 16

我有一些用于超立方体和n球选择的函数,它们生成具有笛卡尔坐标的数据帧,并保证通过超立方体或n球在任意数量的维度上均匀分布:

GenerateCubiclePoints <- function(nrPoints,nrDim,center=rep(0,nrDim),l=1){

    x <-  matrix(runif(nrPoints*nrDim,-1,1),ncol=nrDim)
    x <-  as.data.frame(
            t(apply(x*(l/2),1,'+',center))
          )
    names(x) <- make.names(seq_len(nrDim))
    x
}
Run Code Online (Sandbox Code Playgroud)

nrDim具有a centerl一边长度的维度的立方体/超立方体中.

对于具有nrDim尺寸的n球,您可以执行类似的操作,r半径在哪里:

GenerateSpherePoints <- function(nrPoints,nrDim,center=rep(0,nrDim),r=1){
    #generate the polar coordinates!
    x <-  matrix(runif(nrPoints*nrDim,-pi,pi),ncol=nrDim)
    x[,nrDim] <- x[,nrDim]/2
    #recalculate them to cartesians
    sin.x <- sin(x)
    cos.x <- cos(x)
    cos.x[,nrDim] <- 1  # see the formula for n.spheres

    y <- sapply(1:nrDim, function(i){
        if(i==1){
          cos.x[,1]
        } else {
          cos.x[,i]*apply(sin.x[,1:(i-1),drop=F],1,prod)
        }
    })*sqrt(runif(nrPoints,0,r^2))

    y <-  as.data.frame(
            t(apply(y,1,'+',center))
          )

    names(y) <- make.names(seq_len(nrDim))
    y
}
Run Code Online (Sandbox Code Playgroud)

在2个维度中,这些给出:

在此输入图像描述

来自代码:

 T1 <- GenerateCubiclePoints(10000,2,c(4,3),5)
 T2 <- GenerateSpherePoints(10000,2,c(-5,3),2)
 op <- par(mfrow=c(1,2))
 plot(T1)
 plot(T2)
 par(op)
Run Code Online (Sandbox Code Playgroud)


Gre*_*now 5

另请查看copula包装.这将生成具有均匀边距的立方体/超立方体内的数据,但具有您设置的相关结构.然后可以转换生成的变量以表示其他形状,但仍然使用除独立之外的关系.

如果你想要更复杂的形状,但在形状内感到满足和均匀,那么你可以做拒绝采样:在包含你的形状的立方体内生成数据,然后测试你的形状是否在你的形状内,如果没有,则拒绝它们,然后继续这样做,直到有足够的积分.