Мы можем легко преобразовать ваши данные в форму, где каждая запись вектора представляет собой наблюдение за семьей со значением для числа детей. Таким образом, мы генерируем вектор с длиной общего числа семейств. Каждая запись представляет собой число, представляющее количество детей наблюдаемой семьи.
Для этого мы можем использовать arrayfun
и repmat
повторить записи в cnt
столько раз, сколько есть соответствующие семьи в test
. Поскольку вывод arrayfun
является массивом ячеек, нам нужно использовать cell2mat
, чтобы преобразовать его в «нормальную» матрицу. После этого obs
является указанным выше вектором. Теперь мы можем просто использовать mean
или var
, чтобы рассчитать, что вам нужно.
Вот пример:
test = [30,40,60,30,20,10, 5 ,5, 3] % families
cnt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8] % children per family in test
obs = arrayfun(@(s,c)repmat(c,1,s),test,cnt,'UniformOutput',false);
obs = cell2mat(obs);
mean(obs) % mean
var(obs) % variance
Это результат:
ans =
2.3103
ans =
3.2349
Примечание: Я полагаю, что есть 30 семей с 0 детей (как текст говорит), а не 30 семей с одним ребенком (как говорит ваш бар-сюжет). Просто отрегулируйте cnt
в соответствии с вашими потребностями.
Чтобы получить test
и cnt
назад от obs
, вы можете использовать hist
так:
[test,cnt] = hist(obs,unique(obs));
Для создания вашего бара-участка, используйте bar
с двумя аргументами. Таким образом, у вас есть правильные значения x (в данном случае cnt
).
bar(cnt,test)
xlabel('Children per family')
ylabel('Number of Families')
Постарайся выписав уравнение вы бы использовать, чтобы решить эту проблему вручную, и я думаю, вы можете понять, как реализовать его в Matlab. – cxrodgers