在 R 中生成随机向量 (X,Y,Z) 样本的函数

Function that produces a sample of random vectors (X,Y,Z) in R

我们有一个半径为 1、中心为 1,1 的球体。 地球仪表面有随机分布的斑点。 我们正在生成独立的 Unif(-1,1) 随机变量 X、Y、Z,它们将是随机点的坐标。 将 (X,Y,Z) 除以 √{X2 +Y2 +Z2} 得到距地球中心 1m 的点。 **

编写一个函数 sample3d,它生成一个随机向量样本 (X, Y, Z),每个样本都是地球表面均匀分布的一个点。通过命令 sample3d(n) 调用此函数应生成一个 n × 3 数组,其中每一行都是一个向量 (X, Y, Z)。

我已经完成了 ** 但无法创建 sample3d,任何帮助将不胜感激!

我很高兴尝试想出一些有用的东西,这是我得到的:

首先,我定义了一个函数norm.2,它计算一个向量的两个范数:

norm.2 <- function(x, na.rm){
  if(length(dim(x)) != 0){
    v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
    return(sqrt(colSums(x^2, na.rm = v1.logical)))
  }
  if(length(dim(x)) == 0){
    v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
    return(sqrt(sum(x^2, na.rm = v1.logical)))
  }
}

然后,我继续定义一个函数 sample3d,它将在 3 维 space 中给出 n 个点,所有这些点都具有范数 1,即在 2 维球面上:

sample3d <- function(n, Boundary){

  M <- ifelse(missing(Boundary), sqrt(2e+300), Boundary)

  x1 <- runif(n, min = -M, max = M)
  x2 <- runif(n, min = -M, max = M)
  x3 <- runif(n, min = -M, max = M)
  x <- t(cbind(x1,x2,x3))

  p <- t(t(x)/norm.2(x))

  df <- data.frame(t(p), stringsAsFactors = FALSE)

  return(df)  
}

这是结果的示例:

> head(sample3d(10000))
            x1         x2         x3
1  0.321159709 -0.5014622 -0.8033630
2  0.488181408  0.5547003 -0.6737852
3 -0.661576495 -0.4592729  0.5927773
4 -0.333447393  0.9331249 -0.1345016
5 -0.009070263  0.4267690  0.9043152
6 -0.375122328 -0.2393661 -0.8955373

现在,使用 plotly 包,我们可以从中获得一些有趣的可视化效果:

library(plotly)
dat <- sample3d(100000)
p <- plot_ly(dat, x = ~x1, y = ~x2, z = ~x3, color = norm.2(t(dat)), colors = c('#BF382A', '#0C4B8E')) %>%
  add_markers() %>%
  layout(scene = list(xaxis = list(title = 'X'),
                  yaxis = list(title = 'Y'),
                  zaxis = list(title = 'Z')))