dnorm()如何处理sapply循环中的分位数向量
我正在通过Richard McElreath的统计反思进行工作,我对他在第84页上使用的一些代码的工作方式感到困惑。代码使用贝叶斯网格近似推导两个模型参数,dnorm()如何处理sapply循环中的分位数向量,r,R,我正在通过Richard McElreath的统计反思进行工作,我对他在第84页上使用的一些代码的工作方式感到困惑。代码使用贝叶斯网格近似推导两个模型参数,mu和sigma,以估计样本中的高度分布 这是密码 首先,我们列出候选mu值 mu.list <- seq(from = 140, to = 160, length.out = 200) sigma.list <- seq(from = 4, to = 9, length.out = 200) # grid of candid
mu
和sigma
,以估计样本中的高度分布
这是密码
首先,我们列出候选mu
值
mu.list <- seq(from = 140, to = 160, length.out = 200)
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
现在假设我们有一个测量高度的样本,包含5个测量值
heights <- c(151.76, 139.70, 136.52, 156.84, 145.41)
我们从这个循环中得到的是一个40000个值长的向量,每行post
dataframe对应一个值
length(postVec)
[1] 40000
我不明白的是,如果我们把dnorm()
从循环中取出来,对平均值和sd使用单个值,但在第一个参数中传递相同的5值高度样本向量,就像这样
dnorm( heights, mean = 140, sd = 4, log = TRUE )
我们得到五个值
[1] -6.627033 -2.308045 -2.683683 -11.167283 -3.219861
所以我的问题是:为什么传递到上面的
向量的sapply循环会产生40000个值,而不是5 x 40000=200000个值?
为什么
dnorm()
函数在sapply()
循环之外返回五个值,但是(看起来)其中只有一个值?在dnorm
之前,您缺少sum
:在40000个案例中,它将这5个值相加,以计算整个高度的对数似然度,而不仅仅是单个观察值
例如,如果没有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
啊,是的,sum()
。我讨厌错过这样简单的小事。再次感谢您@Julius Vainora。我不应该在星期天早上6点做这些事情。至少我知道现在发生了什么。
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
sapply(1:2, function (i) sum(dnorm(
heights,
mean = post$mu[i],
sd = post$sigma[i],
log = TRUE)
))
# [1] -26.00591 -25.81760