gpt4 book ai didi

r - dnorm() 如何在 sapply 循环中处理分位数向量

转载 作者:行者123 更新时间:2023-12-05 05:12:47 24 4
gpt4 key购买 nike

我正在研究 Richard McElreath 的 Statistical Rethinking 并且对他在 p.84 上使用的一些代码的工作方式感到困惑。该代码使用贝叶斯网格近似来推导两个模型参数,musigma , 来估计样本中的高度分布。

这是代码

首先我们列出候选人 mu值(value)观

mu.list <- seq(from = 140, to = 160, length.out = 200) 

然后是候选人名单sigma值(value)观

sigma.list <- seq(from = 4, to = 9, length.out = 200) # grid of candidate sigma values

然后我们用 mu 的所有可能组合制作一个数据框和 sigma .

post <- expand.grid(mu = mu.list, sigma = sigma.list) # expand grid so every mu is matched with every sigma

这是一个有 40000 行的数据集。

nrow(post)

[1] 40000

现在假设我们有一个测量高度的样本,其中包含 5 个测量值。

heights <- c(151.76, 139.70, 136.52, 156.84, 145.41)

现在对于我不明白的部分,合理的复杂度sapplymu 的 40000 个候选组合中的每一个计算对数似然的循环和 sigma , 基于五次高度测量的样本。

postVec <- sapply(1:nrow(post), function (i) sum( dnorm( 
heights, # vector of heights
mean = post$mu[i], # candidate mean height value from corresponding position in grid
sd = post$sigma[i], # candidate sigma value from corresponding position in the grid
log = TRUE) ) # make values logs
)

我们从这个循环中得到的是一个 40000 个值长的向量,post 的每一行一个值。数据框。

length(postVec)

[1] 40000

我不明白的是,如果我们采用 dnorm()跳出循环并为均值和标准差使用单个值,但在第一个参数中传递相同的 5 值样本向量高度,就像这样

dnorm( heights, mean = 140, sd = 4, log = TRUE )

我们得到五个值

[1]  -6.627033  -2.308045  -2.683683 -11.167283  -3.219861

所以我的问题是:为什么 sapply 循环会传入 postVec 上面的向量产生 40000 个值,而不是 5 x 40000 = 200000 个值?

为什么 dnorm()函数返回 sapply() 之外的五个值循环但(看似)其中只有一个值?

最佳答案

您在 dnorm 之前缺少 sum:在 40000 个案例中的每一个案例中,它都会将这 5 个值相加以计算整个 heights< 的对数似然 而不仅仅是个人观察。

例如,如果没有 sum 我们确实有两个组合

sapply(1:2, function (i) dnorm( 
heights,
mean = post$mu[i],
sd = post$sigma[i],
log = TRUE)
)
# [,1] [,2]
# [1,] -6.627033 -6.553479
# [2,] -2.308045 -2.310245
# [3,] -2.683683 -2.705858
# [4,] -11.167283 -11.061820
# [5,] -3.219861 -3.186194

使用 sum 时,我们得到了上述矩阵的列总和:

sapply(1:2, function (i) sum(dnorm( 
heights,
mean = post$mu[i],
sd = post$sigma[i],
log = TRUE)
))
# [1] -26.00591 -25.81760

关于r - dnorm() 如何在 sapply 循环中处理分位数向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54271029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com