2011-02-16 35 views
15

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

回答

6

也检查出copula包。这将在具有统一边距的立方体/超立方体内生成数据,但会生成您设置的相关结构。生成的变量然后可以被转换为表示其他形状,但仍然与非独立关系。

如果您想要更复杂的形状,但对形状内的统一和相互独立感到满意,那么您可以进行拒绝采样:在包含形状的立方体内生成数据,然后测试这些点是否在您的形状内,如果没有,那么继续这样做直到有足够的分数。

3

长方体:

df <- data.frame(
    x = runif(1000), 
    y = runif(1000), 
    z = runif(1000) 
) 

head(df) 

      x   y   z 
1 0.7522104 0.579833314 0.7878651 
2 0.2846864 0.520284731 0.8435828 
3 0.2240340 0.001686003 0.2143208 
4 0.4933712 0.250840233 0.4618258 
5 0.6749785 0.298335804 0.4494820 
6 0.7089414 0.141114804 0.3772317 

球:

df <- data.frame(
    radius = runif(1000), 
    inclination = 2*pi*runif(1000), 
    azimuth = 2*pi*runif(1000) 
) 


head(df) 

    radius inclination azimuth 
1 0.1233281 5.363530 1.747377 
2 0.1872865 5.309806 4.933985 
3 0.2371039 5.029894 6.160549 
4 0.2438854 2.962975 2.862862 
5 0.5300013 3.340892 1.647043 
6 0.6972793 4.777056 2.381325 

注:编辑成包括代码领域

+1

我想要在指定形状的边界内生成点..说一个立方体,立方体,球体?? ....有没有什么办法可以产生这样的数据集? – Pradeep 2011-02-16 13:46:14

+0

编辑中添加的代码。 – Andrie 2011-02-16 13:56:18

17

我有超立方体与n维球面选择产生dataframes与笛卡尔一些功能通过超立方体或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 
} 

nrDim尺寸与centerl一个边的长度的立方体/超立方体。

对于一个正球体nrDim尺寸,你可以做类似的事情,在这里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 
} 
2名维

,这些给:

enter image description here

从代码:

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) 
+0

@Richie:thx的调整 – 2011-02-16 22:20:35

+0

非常感谢您的帮助和答复... – Pradeep 2011-02-17 06:26:33

5

几年前,我制作了一个名为geozoo的软件包。它在CRAN上可用。

install.packages("geozoo") 
library(geozoo) 

它有许多不同的功能来生成N维的对象。

p = 4 
n = 1000 

# Cube with points on it's face. 
# A 3D version would be a box with solid walls and a hollow interior. 
cube.face(p) 

# Hollow sphere 
sphere.hollow(p, n) 


# Solid cube 
cube.solid.random(p, n) 
cube.solid.grid(p, 10) # evenly spaced points 

# Solid Sphere 
sphere.solid.random(p, n) 
sphere.solid.grid(p, 10) # evenly spaced points 

我最喜欢看动画的人之一是沿着它的边缘有点的立方体,因为它是我制作的第一个对象之一。它也给你一个顶点之间的距离感。

# Cube with points along it's edges. 
cube.dotline(4) 

此外,请查看网站:http://streaming.stat.iastate.edu/~dicook/geometric-data/。它包含图片和可下载的数据集。

希望它能满足您的需求!