Позвонить сэппли по вектору плотностей?

#r #statistics

Вопрос:

Я генерирую набор плотностей, используя такие функции, как dweibull и dunif. Я хотел бы иметь возможность извлекать их моменты с помощью sapply. Когда я вызываю функцию среднего значения для отдельных распределений, я получаю среднее значение, как и ожидалось. Но когда я делаю это с sapply, вместо этого кажется, что он вызывает mean() для каждого отдельного значения плотности (т. Е. Для каждого значения x, которое я предоставил двейбуллу или дунифу. Есть ли способ добиться здесь правильного поведения? Спасибо!

 weib <- dweibull(seq(from=0, to=25, length=100), shape=1, scale=5)
unif <- dunif(seq(from=1, to=10, length=100), min=1, max=10)
mean(weib) #Works!
dists <- c(weib, unif)
means <- sapply(dists, mean) #Returns a very long list of values, not the mean of weib and unif
 

Ответ №1:

Вы должны хранить данные в виде списка. c(weib, unif) создает единый комбинированный вектор и с помощью sapply(dists, mean) возвращает среднее значение одного числа, т. е. само число.

 dists <- list(weib, unif)
means <- sapply(dists, mean) 
 

Комментарии:

1. Это сработало! Есть какое-нибудь объяснение, почему это имеет значение в данном случае? Спасибо!

2. Я добавил некоторые пояснения в ответ.

Ответ №2:

Вы также можете использовать фрейм данных

 dists <- data.frame(weib, unif)
sapply(dists, mean)
      weib       unif 
0.04034828 0.11111111 
lapply(dists,mean)
$weib
[1] 0.04034828

$unif
[1] 0.1111111
apply(dists, 2,mean)
      weib       unif 
0.04034828 0.11111111 
 

Ответ №3:

Мы можем использовать map

 dists <- list(weib, unif)
library(purrr)
means <- map_dbl(dists, mean)