[英]How to generate a probability density function and expectation in r?
任務:
Eric the fly有一個朋友,Ernie。 假設兩只蒼蠅坐在獨立的位置,均勻分布在地球表面。 設D表示Eric和Ernie之間的歐幾里德距離(即,穿過地球內部的直線)。
對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)
這是一個有趣的問題。 我將概述一種計算方法; 我會把數學留給你。
首先,我們修復隨機種子以獲得可重復性。
set.seed(2018);
我們從單位球面采樣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
效率不高,但這是一個不同的問題。
我們現在從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%左右的誤差。
我們可以將得到的概率分布繪制為直方圖:
# Let's plot the distribution ggplot(data.frame(x = dist), aes(x)) + geom_histogram(bins = 50);
最后,我們可以得到平均值和中位數的經驗估計值。
# Mean mean(dist); #[1] 1.333021 # Median median(dist); #[1] 1.41602
這些值接近理論值:
mean.th = 4/3 median.th = sqrt(2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.