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

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

我正在通过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 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