Я работаю через Статистическое переосмысление Ричарда МакЭлрита и меня смущает, как работает какой-то код, который он использует на стр.84.Код использует байесовскую сеточную аппроксимацию для получения двух параметров модели, mu
и sigma
, для оценки распределения высоты в образце.
Вот код
Сначала мы сделаемсписок кандидатов mu
значений
mu.list <- seq(from = 140, to = 160, length.out = 200)
Затем список кандидатов sigma
значений
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)
Теперь для части, которую я не понимаю, - разумный комплексный цикл sapply
, который вычисляет логарифмическую вероятность для каждой из 40000 комбинаций кандидатов mu
и 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()
из цикла и будем использовать одиночные значения для среднего значения и sd, но передадим тот же самый вектор-образец 5-значных высот в первом аргументе, например,
dnorm( heights, mean = 140, sd = 4, log = TRUE )
Мы получаем пять значений
[1] -6.627033 -2.308045 -2.683683 -11.167283 -3.219861
Итак, мой вопрос: почему цикл Саппли, переданный в вектор postVec
, дает 40000 значений, а не 5 x 40000 = 200000 значений?
Почему функция dnorm()
возвращает пять значений вне цикла sapply()
, но (по-видимому) только одно значение в нем?