2017-09-05 38 views
0

在一個EdX R統計類中,我們被要求查看一個'6'在一組100卷中滾動的時間比例。然後我們被要求滾動100次骰子10,000次,以查看100次模切輥的平均差異的標準偏差。使用replicate()滾動100次骰子10,000次;意想不到的結果

100-模具輥的結果如預期;大約0.1703左右(1/6 = 0.1666667)

但是當我加載replicate()拋出100個骰子10,000次,看到10000個手段,結果不是我所期望的。我沒有看到一個,z分數= 2的範圍之外的任何值:

set.seed(1) 
# get mean of 100 dice rolls 
mean100dice <- function(){ 
    n=100 
    x <- replicate(n, sample(1:6, n, replace=TRUE), simplify='vector') 
    mean(x==6) 
} 
mean100dice() #these come out as expected 

means10k <- replicate(10000, mean100dice(),simplify='vector') 
p = 1/6 
z = (means10k - p)/sqrt(p*(1-p)/n) 
mean(z > 2)  ## I expect this to be > 0 
range(means10k) ## sanity check 

> mean(z > 2) 
[1] 0 
> range(means10k) 
[1] 0.1522 0.1806 
+1

您的代碼沒有在函數「mean100dice」之外定義'n',但您在z的定義中使用它。 n有什麼價值?請實際測試它的價值。 – G5W

+0

我認爲這是(n值)。意思是(z> 2)現在0.0227 – cumin

回答

1

在猜測,你計算z當設定的n <- 100代替n <- 10000

提供顯式變量名是個好主意,所以你不要混淆。例如,您需要區分n_dice_rollsn_replicates


順便說一句,你用於計算100個骰子卷的平均值的代碼是不正確的。

sample(1:6, n, replace=TRUE)n骰子;您也不需要撥打replicate()。我想你想要這樣的事情。

roll_nd6 <- function(n_dice) { 
    sample(1:6, n_dice, replace = TRUE) 
} 
get_fraction_of_sixes_from_rolling_nd6 <- function(n_dice) { 
    mean(roll_nd6(n_dice) == 6L) 
} 
monte_carlo_simulate_get_fraction_of_sixes <- function(n_replications, n_dice) { 
    replicate(
    n_replications, 
    get_fraction_of_sixes_from_rolling_nd6(n_dice), 
    simplify = "vector" 
) 
} 
calc_z_score <- function(actual_p, expected_p) { 
    (actual_p - expected_p)/
    sqrt(expected_p * (1 - expected_p)/length(actual_p)) 
} 
actual_fraction_of_sixes <- monte_carlo_simulate_get_fraction_of_sixes(10000, 100) 
z_scores <- calc_z_score(actual_fraction_of_sixes, 1/6) 
+0

感謝您對樣本()的命名和澄清。結果仍然顯示z分數的40%高於2;範圍(z_scores)= -31.30495 43.82693;有些東西還不正確 – cumin

+0

謝謝大家;該問題最終並未使用z分數的絕對值:均值(_abs_(z_scores)> 2)。 – cumin

0

你有mean100dice錯誤:您品嚐100個骰子和複製是100倍,所以它實際上不是一個100個骰子的平均水平,但100 * 100 = 10,000骰子。當然,這意味着平均值會更接近p值。