![]() |
"Ладно. пора кончать этот бардак. Давайте её закопаем" Итак, коллеги. Товарищ Дмитрий В. получил интересные результаты, стал мучать их в Excel и получил картинки, которые никуда не годятся. Дла начала, у нас распределение явно дискретное, а мы рисуем график как для непрерывного. Зачем точки соединять то? Плюнем на Excel слюною, пусть в нем, товарищи, успешные менеджеры отчеты делают, нам путь в нормальный статистический пакет, поэтому только хардкор, только R. Устанавливаем R, создаем вектор данных. Код:
> LT<-c(rep(1,9),rep(2,267),rep(3,2843),rep(4,5450),rep(5,6564),rep(6,7044),rep(7,7518),rep(8,7071),rep(9,5620),rep(10,4016),rep(11,2545),rep(12,1494),rep(13,854),rep(14,416),rep(15,214),rep(16,122),rep(17,53),rep(18,16),rep(19,7),rep(20,2),21,22) Данные берем с графика, любезно предоставленного нам. Смотрим на результат и радуемся Код:
> summary(LT) Сказано-сделано, строим 4 графика в одном. Код:
> old.par <- par(mfrow=c(2,2)) Что мы, собственно говоря видим. А видим, что распределение у нас вполне милое, да слегка несимметричное, но с кем не бывает. Пытаемся натянуть сову на глобус. Для этого используем подгонку распределения методом максимального правдоподобия (maximum-likelihood estimation, MLE). Метод это весьма кошерен, но связан со сложными вычислениями. К счастью для нас, в R уже всё таки имеется. Достаточно подключить библиотеку MASS. Резвимся по полной Код:
> library(MASS) Неплохим графическим методом оценки качества подгонки распределения является график квантилей (quantile). Квантиль — это такое число, что заданная случайная величина не превышает его лишь с указанной вероятностью. Можно рассматривать квантиль как функцию вероятности Q(p), обратную функции распределения вероятностей. Если мы подогнали правильно, то точки на графике должны лежать рядом с прямой y = x. Строим четыре графика для наших распределений. Код:
> old.par <- par(mfrow=c(2,2)) Кому как, а мне больше нравится старик Пуассон. Попробуем нарисовать график аппроксимирующих распределений. Код:
> plot(ecdf(LT),verticals=T,main="Аппроксимация функции распределения") http://aspirantura.spb.ru/forum/pict...&pictureid=972 Ну, пока хватит. Коню понятно, что здесь никакая не гамма, а обычный Пуассон, причем Лямбда равна среднему числу букв в слове. Ну, теперь сам бог велел провести тест Колмогорова-Смирнова Код:
> ks.test(LT,rpois(0:2200/100,lambda=7.19983886)) Бурные продолжительные аплодисменты. А гамма ваша, кака редкая...
Код:
> ks.test(LT,rgamma(0:2200/100, 7.257622928, 1.008025740)) Согласен на соавторство ;) P.S. Ну, мои маленькие девиантные друзья, если кто хочет поподробнее почитать про подгонку распределений в R, рекомендую на сон грядущий статью "Fitting distributions with R" P.P.S. А список наиболее распространенных распределений можно посмотреть вот тут, в вашей любимой Википедии |
Цитата:
Чистенько, аккуратненько, корректненько. |
Hogfather, выскажу огроменное спасибо и тут.
Вляпалась..., Цитата:
|
Цитата:
|
"Пора кончать этот бардак. Давайте её откопаем" Как говорится. не только методом максимального правдоподобия славен R. Ту же задачу можно попробовать решить нелинейным методом наименьших квадратов. Для этого построим кумулятивную (интегральную) функцию распределения и попробуем подогнать понравившегося нам Пуассона. В общем, сделаем примерно то, что пытался проделать Дмитрий В. в Excel. Код:
> # Понеслась! Код:
> # Расчет адекватности модели Для лямбды можно посчитать доверительный интервал Код:
> confint(mdl) Код:
> plot(residuals(mdl),main="Ошибки модели") |
Спасибо.
Цитата:
Цитата:
*бурчит под нос* К освоению R приступить, о выполнении доложить себе лично! |
Цитата:
|
Цитата:
|
Ошибка модели большая вышла. Это не слов, а процентов. С чего я про слова решил?
Да и считать здесь MAPE некорректно. Убрал. |
Hogfather, понятно.
|
"Нет, всё-таки откопаем..." Итак, более корректная и интересная первая подгонка, поскольку во втором случае мы просто подгоняем функцию по 22 точкам. С интересом обнаружил, что в 2012 году для R вышел более мощный пакет подгонки fitdistrplus. Попробуем в него поиграть. Опять берем Гамму. Код:
>#Подключаем библиотеку Код:
># Подгоняем распределение Пуассона Пакет позволяет построить красивые картинки. Причем очень просто. Код:
># Рисунок для гаммы Рисунок 1 -- Подгонка гамма-распределения http://aspirantura.spb.ru/forum/pict...&pictureid=976 Рисунок 2 -- Подгонка распределения Пуассона Рисунок 2 можно также получить не прибегая к построению модели. Для распределения Пуассона с лямбдой равной средней длине слова это выглядит так: Код:
> plotdist(LT,"pois",para=list(lambda=mean(LT))) Код:
># Для гамма-распределения Код:
> descdist(LT) http://aspirantura.spb.ru/forum/pict...&pictureid=977 Но, поскольку у нас распределение дискретное, мы нарисуем другой график. Код:
> descdist(LT,discrete = TRUE,boot=1000) Почти Пуассон, красота! В общем, пакет мне понравился. Буду пользоваться. P.S. Если как положено считать Хи-квадрат для дискретного распределения, то видно, что и распределение Пуассона не торт. Еще разные распределения
Код:
> XZ<-fitdist(LT,"beta") Добавлено через 3 часа 40 минут Цитата:
Цитата:
В общем, Колмогорова-Смирнова в данном случае не трогаем. Хотя, красивый результат вышел. То-то мне он подозрительным показался. |
Цитата:
|
Цитата:
Надеюсь, что сюда математик нормальный забредет, подскажет идею какую-нибудь. Добавлено через 8 часов 12 минут Мысль для Дмитрий В. и не только. Пусть у Вас имеются данные по 5 языкам. Чтобы на одном графике показать все распределения, лучше всего использовать диаграмму "Ящик с усами".Привожу пример. Данные выдуманы (заполняются в начале скрипта). У Дмитрия наверняка они есть. Код:
#Инициируем данные, чтобы были, заполнив по 1000 чисел из распределения Пуассона и нормального распределения. http://aspirantura.spb.ru/forum/pict...&pictureid=983 Добавлено через 58 минут А вот пример Бутстреппинга Код:
> bw<-bootdist(XY,niter=1001) |
Hogfather, :up:, выходящие за фрейм.
|
Вот тут меня спрашивают, а как посчитать R2. Не знаю, зачем, но почему бы не посчитать. Формула есть, а заодно и MAE (среднюю абсолютную ошибку) посчитаем.
Для этого сделаем по-быстрому функцию Код:
# Функция, вычисляющая R.Sqv и MAE LT - у нас определено выше, 7.199839 - это полученная в результате лямбда. Результат: Код:
> MyInfo(LT,7.199839) MAE=191.5201 слов. Вот тут уже именно слов ;). График http://aspirantura.spb.ru/forum/pict...&pictureid=985 Теперь о R2. Обратите внимание, что будет если мы чуть изменим лямбду. Код:
> MyInfo(LT,8) Добавлено через 58 минут Можно и совсем облениться, если данных много надо обработать, а вводить команды одни те же лень. Пишем функцию, которая делает за нас все. Код:
# Функция, которая только за пивом не бегает Код:
> MyInfoPois(LT) Картинки повторять не буду. Они все уже приведены. Лирическое отступление для Дмитрия В. и не только. Ежу понятно, что вышеописанное никому не нужно, разве что, продемонстрировать возможности R (я себе такую цель ставил). Вообще, прежде чем проводить научное исследование, надо себе поставить цель. Поговорим об этом. У нас есть некие эмпирические данные, в данном случае соответствие длины слов количеству букв. Какие возможны варианты. 1. Нам интересна математическая модель, которая показывает зависимость количества слов в языке данной длины в данном словаре от количества букв в слове. Звучит идиотски, согласитесь. Во всяком случае, это легко аппроксимируется полиномом или так любимой Дмитрием гаммой (но полином лучше будет). Да, в данном случае мы можем говорить о R квадрате. Но! В данном случае у нас данные фиксированы. Нельзя добавлять или убавлять слова, поскольку это рушит нашу модель. Случайная выборка из словаря рушит всё напрочь! И модель не выполняет своей функции -- не объясняет закономерность. 2. Нам интересна закономерность, описывающая частотное распределение слов по длине. Тогда мы говорим о дискретном стохастическом процессе, причем нас интересуют именно вероятности и мы подгоняем не только дифференциальную, но и интегральную функцию распределения. Тогда ошибки считать -- заниматься профанацией. Для каждой выборки они будут свои. Задача стоит выбрать лучшее из возможных плохих вариантов. Тут в нас начинают работать информационные критерии AIC и BIC и мы выбираем из нескольких распределений лучшее. Если бы сошелся Хи-квадрат, было бы вообще счастье. Но, к сожалению, счастье бывает только в учебниках. В жизни приходится мучатся. Где-то так. Никто, правда нам не мешает сказать, что для всего словаря Эр. квадрат такой-то, а средняя абсолютная ошибка такая-то (причем для дифференциальной и интегральной функции они будут разные, гы). А смысл? Другой вариант, бутстреппинг. Т.е. случайная выборка, пересчет Эр квадрат и ошибки для каждого случая и отображение этого на двумерном графике. Но это чересчур брутально. Надеюсь, что несильно наврал, а если и наврал меня поправят. |
Текущее время: 22:20. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
© 2001—2025, «Аспирантура. Портал аспирантов»