如何在r中生成概率密度函数和期望?

时间:2018-03-19 23:44:56

标签: r statistics

任务:

  埃里克飞有一个朋友,厄尼。假设两只苍蝇坐在独立的位置,均匀分布在地球表面。设D表示埃里克和厄尼之间的欧几里德距离(即穿过地球内部的直线)。

     

猜测D的概率密度函数并给出一个   估计其预期值E(D)。

到目前为止,我已经完成了在地球表面生成两个点的功能,但我不确定下一步该做什么:

sample3d <- function(2)
  {
  df <- data.frame()
  while(n > 0){
    x <- runif(1,-1,1)
    y <- runif(1,-1,1)
    z <- runif(1,-1,1)
    r <- x^2 + y^2 + z^2
    if (r < 1){
      u <- sqrt(x^2+y^2+z^2)
      vector = data.frame(x = x/u,y = y/u, z = z/u)
      df <- rbind(vector,df)
      n = n- 1
    }
  }
  df
}
E <- sample3d(2)

1 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。我将概述一种计算方法;我会把数学留给你。

  1. 首先我们修复随机种子以获得再现性。

    set.seed(2018);
    
  2. 我们从单位球体表面采样10^4点。

    sample3d <- function(n = 100) {
      df <- data.frame();
      while(n > 0) {
        x <- runif(1,-1,1)
        y <- runif(1,-1,1)
        z <- runif(1,-1,1)
        r <- x^2 + y^2 + z^2
        if (r < 1) {
          u <- sqrt(x^2 + y^2 + z^2)
          vector = data.frame(x = x/u,y = y/u, z = z/u)
          df <- rbind(vector,df)
          n = n- 1
        }
      }
      df
    }
    df <- sample3d(10^4);
    

    请注意,sample3d效率不高,但这是一个不同的问题。

  3. 我们现在从df中随机抽取2个点,计算这两个点之间的欧几里德距离(使用dist),并重复此过程N = 10^4次。

    # Sample 2 points randomly from df, repeat N times
    N <- 10^4;
    dist <- replicate(N, dist(df[sample(1:nrow(df), 2), ]));
    

    正如@JosephWood所指出的,数字N = 10^4有点武断。我们使用bootstrap来推导经验分布。对于N -> infinity,可以证明经验引导分布与(未知)种群分布(Bootstrap定理)相同。经验和人口分布之间的误差项是1/sqrt(N)的顺序,因此N = 10^4应该导致1%左右的误差。

  4. 我们可以将得到的概率分布绘制为直方图:

    # Let's plot the distribution
    ggplot(data.frame(x = dist), aes(x)) + geom_histogram(bins = 50);
    
  5. enter image description here

    1. 最后,我们可以得到平均值和中位数的经验估计值。

      # Mean
      mean(dist);
      #[1] 1.333021
      
      # Median
      median(dist);
      #[1] 1.41602
      

      这些值接近理论值:

      mean.th = 4/3
      median.th = sqrt(2)