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 center和l一边长度的维度的立方体/超立方体中.
对于具有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)
另请查看copula包装.这将生成具有均匀边距的立方体/超立方体内的数据,但具有您设置的相关结构.然后可以转换生成的变量以表示其他形状,但仍然使用除独立之外的关系.
如果你想要更复杂的形状,但在形状内感到满足和均匀,那么你可以做拒绝采样:在包含你的形状的立方体内生成数据,然后测试你的形状是否在你的形状内,如果没有,则拒绝它们,然后继续这样做,直到有足够的积分.