在R

时间:2018-03-17 11:29:21

标签: r function 3d statistics sample

我们有一个半径为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,任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:0)

我很乐意尝试提出一些有用的东西,这就是我所得到的:

首先,我定义了一个函数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维空间中给出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')))

Yielding: