All streams
Search
Write a publication
Pull to refresh
34
0
Евгений Чанков @jzha

User

Send message
Любопытно сравнить гистограммы Ирландии (IE) и России (RU) в примере для ESS данных. Навскидку ожидаешь видеть цвет у Ирландии немного светлее, чем у России, а не так как оно есть на самом деле. Если сравнить взвешенные медианы, то для России получается 5, для Ирландии — 7.
Илья, здравствуйте. Спасибо за статью!

У меня вопрос немного в сторону — почему в примерах для ESS и ACS вы используете невзвешенные данные? Понятно, что это просто пример, но всё таки, например, поменяется упорядочение стран на графике для ESS.

Спасибо за отклик!


Сравнил цветное облако слов и в однотонной палитре. Согласен с вами.


Есть пакет fst для быстрой сериализации данных.
Бенчмарки авторов этого пакета показывают, что fst значительно быстрее feather.
Но, вообще говоря, такое преимущество зависит от используемых данных, так как "магия" fst основана на компрессии данных.

Очень интересная книга у вас (сужу по оглавлению).
По CHAID'у в открытом доступе есть хорошая обзорная статья — CHAID and Earlier Supervised Tree Methods.

Спасибо за статью!


Еще немного оптимизации — можно воспользоваться тем, что матрица является персимметричной и работать с побочными диагоналями. В таком случае сокращается число итераций в цикле и не надо использовать min


IntegerMatrix build_cpp_PerSym(const int n) {
  IntegerMatrix x(n, n);
  for (int i=0; i<n; i++)
    for (int j=0; j<=i; j++)
      x(j, i-j) = x(n-1-j, n-1-(i-j)) =  i+1;
  return x;
}

У меня microbenchmark показывает, что этот метод немного быстрее, чем build_cpp.


В R также можно использовать из коробки замечательные cpp библиотеки для работы с линейной алгеброй — Armadillo и Eigen. В Armadillo требуемая матрица генерируется, можно сказать, в одну строчку


umat flipToeplitz(const int n) {
  return fliplr(toeplitz(linspace<uvec>(n, 1, n)));
}

Здесь столбцы матрицы Тёплица от вектора n:1 записываются в обратном порядке.
Этим методом матрицы не очень большого размера (~ 100) получается генерировать примерно за то же время, что и методом build_cpp.

Не вводите, пожалуйста, никого в заблуждение. В данных, использованных в этой публикации, к Саратову относились 373 УИКа. Уточню, что ТИКи Саратова — Кировский, Ленинский, Фрунзенский, Волжский, Заводской, Октябрьский.

Да, плохо, что нет ссылок на предыдущие работы по этой теме. Сейчас добавил.
Моей основной статьей была Часть 1. Вторую часть я сделал по просьбе коллеги, образно говоря за 5 минут, и работами Сергея Шпилькина не вдохновлялся, хотя, разумеется, знал о них. Ведь здесь я просто построил одну диаграмму рассеяния с выбором осей, заданием региона и возможностью сглаживать точки на графике.

Да, уменьшение дисперсии результатов партий по УИКам позволяет увидеть линии. Правда в таком случае плотность линий повышается в районе мат. ожиданий, тогда как в реальности мы видим, что плотность линий больше у начала координат. Наверняка, причина в том, что результаты партий не являются норм. распред. случ. величинами с отсечением отрицательных значений. Если для моделирования использовать гамма распределение, то графики получаются более похожими на наблюдаемый, хотя проблема с плотностью линий остается.


В любом случае, округление + малые мат. ожидания и дисперсии во многом объясняют линии. Позже добавлю обновление в публикацию.

Спасибо за код.
Вот тот же код на R в виде функции от d1 — числа проголосовавших на участке избирателей.


sim.data <- function(d1){
d2 <- round(pmax(0, rnorm(length(d1), 0.05, 0.1)*d1))
d3 <- round(pmax(0, rnorm(length(d1), 0.03, 0.1)*d1))
data.frame(x = d2/d1*100, y = d3/d1*100)
}


Для числа проголосовавших полученных сэмплирование от 10 до 200 у меня получается примерно та же картина, что и у вас set.seed(321); d1 = sample(10:200, 100000, replace = T)



Но эффект участков с малым числом проголосовавших уже обсуждался. На моей картинке выше были отобраны участки с числом проголосовавших избирателей от 101. Что будет если сэмплировать от 101 до 1000? То есть d1 = sample(101:1000, N, replace = T). Получается график ниже. У вас тоже?



На всякий случай, в реальных данных распределение числа проголосовавших избирателей на УИКах, с ограничением > 100, следующее
Min. 1st Qu. Median Mean 3rd Qu. Max.
101.0 274.0 528.0 596.6 801.0 5654.0
Если использовать эти реальные данные в качестве аргумента d1 функции генерации данных, то получаем такую диаграмму


Очень хорошо, это, возможно, объясняет ситуацию. Уточните, пожалуйста, как вы генерировали данные?

Этого не знал :), но Web Mercator сама по себе популярная проекция, как я посмотрел. Вообще, это мой первый опыт работы с географическими картами.
Для leaflet вне R есть дополнение по работе со многими популярными проекциями. Чем ограничена базовая версия leaflet, которая используется в R, — надо смотреть.

Илья, я использовал проекцию, которая была задана авторами геоданных, т.е. просто оставил ту, которую они рекомендовали. Спасибо за ссылку!
Полагаю, ваше замечание совпадает с комментарием arteast ниже. Привел график с осями Коммунисты Россия — Яблоко для УИКов с числом проголосовавших избирателей > 100.
Да, определенный эффект от таких 'малых' участков есть. Я это проверял ранее, но, как мне кажется, он не объясняет эффект таких линий. Но вы правы, лучше это вынести явным образом. Обновил репозиторий на GitHub, теперь можно отсекать участки с числом проголосовавших избирателей меньше заданного.
Вот такая картинка получается для Коммунистов — Яблока, если выкинуть участки с числом избирателей до 100

Уравнение будет чуть другим: comments_log_ij = intercept + delta_i + e_ij. Связь видна, на мой взгляд, даже более наглядно — с ростом номера интервала в karma_cut, величина delta почти всегда растет и значимо отличается от 0.
Тогда как в summary модели m.lm < — lm(comments_log ~ karma_cut — 1) мы видим, что средние для всех групп значимо отличаются от 0. Для вашей задачи, как мне кажется, это не так существенно.

Но главное — взять и выполнить команду anova(m.lm), просто позабыв о таком задании модели. И тогда, без свободного члена в модели, можно получить ложное отклонение нулевой гипотезы.
Спасибо за подробную публикацию по статистике!

Позвольте, добавлю несколько слов
1) Свободный член в линейной модели убирать не стоит. Функция aov — обёртка для построения такой модели lm(comments_log ~ karma_cut),
в которой Вы как раз получаете F-statistic: 556.2 on 6 and 14668 DF, а не 1.719e+04 on 7.
2) Возможно, стоит упомянуть о линейных контрастах в моделях — более общая и гибкая альтернатива парным сравнениям (в частности, HSD тесту Тьюки). Этот метод реализован в функции glht пакета `multcomp`.
Хорошо, читабельность/удобство вещи субъективные. Приведите, пожалуйста, примеры или ссылки на тесты, в которых data.table начисто проигрывает по скорости расчетов dplyr. Я полагаю, такого быть не может. Возможно, ошибаюсь, не отслеживаю изменения в dplyr.
Илья, пакет data.table включен в ваш список, но хочу лишний раз его порекоммендовать к использованию. Очень удобный синтаксис и превосходное быстродействие при работе с данными.
Еще, на мой взгляд, стоит упомянуть пакет googleVis для построения Google Charts диаграмм.
Спасибо за полезный список!

Интересно знать, Rcpp и прочие Rcpp* библиотеки не входят в ваш активный набор инструментов?

Information

Rating
Does not participate
Registered
Activity