Я нашел это у Денниса Мерфи на другом форуме (https://groups.google.com/forum/#!topic/ggplot2/enavD18MmkY):
Привет:
Чтобы расширить комментарии Хэдли, я бы посоветовал вам обратиться к Лёссу и прочитать главу вБелая книга, на которую она ссылается, чтобы лучше понять, как работает процедура лесса, не имеет смысла для меня, почему нужно использовать интервал 1, чтобы соответствовать модели лесса с наблюдениями 40K.
По своейnature, loess - это алгоритм «локальной регрессии» с акцентом на «local». Аргумент span контролирует пропорцию данных, которая должна использоваться для получения каждого локального соответствия - чем шире диапазон, тем сглаживается функция соответствия.Если вы внимательно посмотрите на сам алгоритм, вы обнаружите, что он ОЧЕНЬ интенсивно использует память, поэтому, если вы настаиваете на подборе лесса с большим размером выборки, по крайней мере, уменьшите диапазон. Вот пример, чтобы проиллюстрировать, что вы действительно можете уместитьМодель лёсса в ggplot2 с 40K наблюдениями.
x <- seq(0, 100, length.out = 40000)
# A periodic function
DF <- data.frame(x = x, y = 1 + sin(x) + 0.5 * cos(2 * x) + rnorm(40000))
library(ggplot2)
# Uses the default "auto" method to which Hadley referred:
ggplot(DF, aes(x = x, y = y)) +
geom_point(alpha = 0.05, shape = 21) +
geom_smooth(size = 1)
Результат этого [gam] соответствия, который завершает rathБыстро, более или менее эквивалентно модели Лесса с большим пролетом (например, 1), но гораздо более вычислительно эффективен.Периодичность почти полностью игнорируется в подобранной кривой, так как она была усреднена.Чтобы зафиксировать периодичность с помощью алгоритма локальной регрессии, вам необходимо уменьшить долю данных, предназначенных для каждого локального соответствия.Следующий вызов занимает примерно 1,5-2 минуты (предположительно), но на моем ноутбуке он в конце концов подходит к лессовой нагрузке (с 12 ГБ ОЗУ + 64-битная микросхема R-3.2.0 + i7):
ggplot(DF, aes(x = x, y = y)) +
geom_point(alpha = 0.05, shape = 21) +
geom_smooth(method = "loess", span = 0.1, size = 1)
Когда я запустил это в графическом интерфейсе R, я получил сообщение «Не отвечает», когда R сильно удалялся, но в конце концов график все же появился.
Вы должны быть в состоянии получить более точную локальную подгонку, дополнительно уменьшив диапазон, поскольку в этом примере span = 0.1 означает, что он использует приблизительно 4000 точек для локальной подгонки, что намного больше, чем требуется дляКривая это просто по форме.Следующий вызов занял около 8-10 секунд, с одним отличием в спецификации:
ggplot(DF, aes(x = x, y = y)) +
geom_point(alpha = 0.05, shape = 21) +
geom_smooth(method = "loess", span = 0.005, size = 1)
В этом вызове span = 0.005 означает, что в каждом локальном подборе используется приблизительно 200 наблюдений, что все еще довольно велико.,Я бы порекомендовал поэкспериментировать с немного меньшими и большими пролетами, чтобы увидеть, как это влияет на подобранную модель лесса.Выбор диапазона должен основываться на количестве строк во фрейме входных данных, форме функции ввода с шумом и желаемой степени гладкости.
Пример был преднамеренно выбран, чтобы проиллюстрировать, почему выбор пролета имеет значение для лесса.С другой стороны, полученное вами сообщение об ошибке косвенно указывает на то, что loess - это проблема с памятью, и вам нужно знать достаточно о том, как он работает как алгоритм, чтобы продуктивно использовать его.
Деннис
Когда я уменьшаю значение диапазона, мой код выполняется без ошибок.Даже с размахом 0,1 мой последний сет занял 2 часа.Я попытался с диапазоном 0,01 и получил ошибку, чтобы увеличить мой диапазон.