2011-02-16 32 views

Respuesta

6

También echa un vistazo al paquete de cópula. Esto generará datos dentro de un cubo/hipercubo con márgenes uniformes, pero con las estructuras de correlación que establezca. Las variables generadas se pueden transformar para representar otras formas, pero aún con relaciones que no sean independientes.

Si desea formas más complejas pero está satisfecho con uniforme e independiente de la forma, puede hacer un muestreo de rechazo: generar datos dentro de un cubo que contenga su forma, luego probar si los puntos están dentro de su forma, rechazarlos si no, entonces sigue haciendo esto hasta que haya suficientes puntos.

+0

No veo cómo podría usar las cópulas para generar puntos aleatorios en un espacio n-dimensional , obligado por ciertos límites. La cópula elipsoide, por ejemplo, no tiene una distribución uniforme en absoluto, se basa en la distribución normal multivariante (o t). Uno debe ser muy cuidadoso al usar este gran paquete, y saber que lo que sale es exactamente lo que uno cree que es. No lo usaría para este propósito. El muestreo de rechazo es una cuestión totalmente diferente, esa es una solución perfecta. –

3

cuboides:

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 

Esfera:

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 

Nota: editado para incluir código para esfera

+1

Quiero generar puntos dentro del límite de una forma específica ... decir un paralelepípedo, cubo, esfera ?? .... ¿hay alguna forma de generar dichos conjuntos de datos? – Pradeep

+0

Código agregado en edición. – Andrie

17

tengo algunas funciones para la selección hipercubo y n-esfera que generan tramas de datos con cartesiano coordina y garantiza una distribución uniforme a través del hipercubo o n-esfera para una cantidad arbitraria de dimensiones:

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 
} 

es en un cubo/hipercubo de nrDim dimensiones con un center y l la longitud de un lado.

Para un n-esfera con nrDim dimensiones, se puede hacer algo similar, donde r es el radio:

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 
} 

en 2 dimensiones, éstas dan:

enter image description here

De código :

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 para el ajuste –

+0

Muchas gracias por su ayuda y respuestas ... – Pradeep

+0

@Pradeep - Si esto responde mejor a su pregunta, debe considerar aceptar esta respuesta en lugar de la que usted hizo. –

5

Hace un par de años, hice un paquete llamado geozoo. Está disponible en CRAN.

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

Tiene muchas funciones diferentes para producir objetos en N dimensiones.

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 

Una de mis favoritas para ver animado es un cubo con puntos a lo largo de sus bordes, porque fue uno de los primeros objetos que he hecho. También te da una sensación de distancia entre vértices.

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

Además, echa un vistazo a la página web: http://streaming.stat.iastate.edu/~dicook/geometric-data/. Contiene imágenes y conjuntos de datos descargables.

Espero que satisfaga sus necesidades!

+0

Muchas gracias ll definitivamente comprobarlo :) – Pradeep

+0

ese paquete tuyo parece prometedor, gracias por señalar allí. – daroczig

Cuestiones relacionadas