Estoy tratando de generar multivariante de datos en forma de Saturno (larga historia).
Más formalmente;
- *cluster 1 es un rango-p Gaussiano con matriz de correlación R (donde cada fuera de la diagonal de la entrada de R es el mismo número en $(0,1)$).
- clúster 2 es un montón de puntos distribuidos en un host de hyper-plan de clasificación p-1, alrededor del ecuador de la categoría 1, que se encuentra más allá de una cierta distancia de mahalanobis wrt para cluster1 de decir $\zeta$.
El rechazo de muestreo está bien, siempre y cuando la tasa de rechazo es pequeño: esta configuración tiene que ser generado muchas veces por $n$ $p$ grande de forma fiable.
Actualización: Por lo que he implementado Bob Durrant la solución:
x0<-matrix(rnorm(n*p),n,p)
b0<-matrix(rnorm(n*p),n,p)
b1<-qchisq(0.99,df=p);
b2<-sqrt(c(b1,b1*1.25))
b0<-b0/sqrt(rowSums(b0*b0))*runif(n,b2[1],b2[2])
plot(rbind(x0,x1))
mahalanobis(cbind(0,b0),colMeans(x0),var(x0))/(qchisq(0.99,df=p))
dando la imagen adjunta, los cuales se ven en efecto, como Saturno . con los anillos situados al menos a @ qchisq(0.99,df=p) distancia desde el centro.
Ahora, sin embargo, quiero que mi saturno a ser en forma de elipse, es decir, tienen correlación de la estructura de R. El problema es que se me pre-multiplicar $\verb+x0+$$\verb+cbind(0,x1)+$$R^{1/2}$, los anillos no estamos en el ecuador :(
Update2:
Por ejemplo, las cosas ya se tuercen cuando puedo reemplazar la diagonal de la varianza de la estructura de arriba con algo más.
Por ejemplo:
library(MASS)
x0<-mvrnorm(n,rep(0,p),diag(rchisq(p,p),p))
b0<-mvrnorm(n,rep(0,p-1),diag(rchisq(p-1,p-1),p-1))
b1<-qchisq(0.99,df=p);
b2<-sqrt(c(b1,b1*1.25))
b0<-b0/sqrt(rowSums(b0*b0))*runif(n,b2[1],b2[2])
mahalanobis(cbind(0,b0),colMeans(x0),var(x0))/(qchisq(0.99,df=p))
la mayoría de las distancias son demasiado grandes (comparar con la salida a la misma llamada después de usar la diagonal de co-varianza de la matriz de arriba)!
Update3
delta<-0.9
p<-3
R<-matrix(runif(p^2,delta*0.99,delta),p,p)
#to avoid repeating eigen-values, i jitter a bit.
diag(R)<-1