Как dnorm () работает с вектором квантилей в цикле Саппи - PullRequest
0 голосов
/ 19 января 2019

Я работаю через Статистическое переосмысление Ричарда МакЭлрита и меня смущает, как работает какой-то код, который он использует на стр.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(), но (по-видимому) только одно значение в нем?

1 Ответ

0 голосов
/ 19 января 2019

Вы пропускаете sum до dnorm: в каждом из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...