Создание многомерных данных

Имеет ли R пакет для генерации случайных чисел в многомерном пространстве? Например, предположим, что я хочу создать 1000 точек внутри кубоида или сферы.

Ответы

Ответ 1

Также проверьте комплект копулы. Это приведет к получению данных в кубе/гиперкубе с однородными полями, но с настройками корреляции. Сгенерированные переменные затем могут быть преобразованы для представления других фигур, но все же с отношениями, отличными от независимых.

Если вам нужны более сложные фигуры, но они довольны равномерностью и идеалом внутри формы, вы можете просто выполнить отбор проб: произвести данные в кубе, который содержит вашу фигуру, а затем проверить, находятся ли точки в вашей форме, отклонить их, если а затем продолжайте делать это, пока не будет достаточно очков.

Ответ 2

У меня есть некоторые функции для выбора гиперкуба и 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 с a center и l длиной одной стороны.

Для n-сферы с размерами 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)

Ответ 3

Пару лет назад я сделал пакет под названием geozoo. Он доступен на CRAN.

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

Он имеет множество различных функций для создания объектов в N-измерениях.

p = 4
n = 1000

# Cube with points on it 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 edges.  
cube.dotline(4)

Также посетите веб-сайт: http://streaming.stat.iastate.edu/~dicook/geometric-data/. Он содержит изображения и загружаемые наборы данных.

Надеюсь, он удовлетворит ваши потребности!

Ответ 4

куб:

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

Примечание: отредактировано, чтобы включить код для сферы

Ответ 5

Вот один из способов сделать это. Скажем, мы надеемся сгенерировать группу 3d-точек вида y = (y_1, y_2, y_3)

  1. Образец X из многомерного гауссова со средним нулем и ковариационной матрицей R.

       (x_1, x_2, x_3) ~ Multivariate_Gaussian(u = [0,0,0], R = [[r_11, r_12, r_13],r_21, r_22, r_23], [r_31, r_32, r_33]]
    

    Вы можете найти функцию, которая генерирует многовариантные сэмплы Гаусса в пакете R.

  2. Возьмите гауссовский cdf каждого ковариата (фи (x_1), фи (x_2), фи (x_3)). В этом случае фи является гауссовым cdf наших переменных. Т.е. phi (x_1) = Pr [x & lt; = x_1] Посредством интегрального преобразования вероятности эти (phi (x_1), phi (x_2), phi (x_3)) = (u_1, u_2, u_3) будут одинаково Нарушено на [0,1].

  3. Затем возьмите обратный cdf каждого равномерно распределенного маргинала. Другими словами, возьмите обратный cdf для u_1, u_2, u_3:

    F ^ {-1} (u_1), F ^ {-2} (u_2), F ^ {-3} (u_3) = (y_1, y_2, y_3), где F - предельный cdf распределения Вы пытаетесь взять образец из.