Установите линию с LOESS в R

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

Как это воспроизвести:

Загрузите набор данных с сайта https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1 (всего два КБ) и используйте этот код:

load(url('https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1'))
lw1 = loess(y ~ x,data=data)
plot(y ~ x, data=data,pch=19,cex=0.1)
lines(data$y,lw1$fitted,col="blue",lwd=3)

Любая помощь приветствуется. Спасибо!


person leo    schedule 11.03.2013    source источник
comment
Я попытался загрузить файл данных. Скачал, но прочитать не смог. В каком он формате? Не могли бы вы загрузить текстовый файл ASCII DOS? Может быть, я делаю что-то не так. Может быть, мне нужно, чтобы DropBox был установлен на моем компьютере, чтобы прочитать загруженный файл? Спасибо.   -  person Mark Miller    schedule 07.07.2015


Ответы (3)


Вы построили соответствующие значения для y, а не для x. Кроме того, вам нужно будет упорядочить значения x перед построением линии. Попробуй это:

lw1 <- loess(y ~ x,data=data)
plot(y ~ x, data=data,pch=19,cex=0.1)
j <- order(data$x)
lines(data$x[j],lw1$fitted[j],col="red",lwd=3)

введите здесь описание изображения

person Rob Hyndman    schedule 11.03.2013

К сожалению, данные больше не доступны, но более простой способ подобрать непараметрическую линию (локально взвешенное сглаживание диаграммы рассеяния или просто LOESS, если хотите) — использовать следующий код:

scatter.smooth(y ~ x, span = 2/3, degree = 2)

Обратите внимание, что вы можете поиграть с параметрами span и degree, чтобы добиться произвольной плавности.

person HonzaB    schedule 26.04.2017
comment
Данные вернулись, спасибо за подсказку. Вероятно, вы можете изменить свой ответ соответствующим образом. - person leo; 18.05.2017

Может быть, уже поздно, но у вас есть варианты с ggplot (и dplyr). Во-первых, если вы хотите построить лессовую линию только по точкам, вы можете попробовать:

library(ggplot2)
load(url("https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1"))
ggplot(data, aes(x, y)) + 
geom_point() +
geom_smooth(method = "loess", se = FALSE)

Линия лесса с ‹code›ggplot::geom_smooth()‹/code›

Другой способ — функция predict() с использованием лессовой посадки. Например, я использовал функции dplyr для добавления прогнозов в новый столбец с именем "loess":

  library(dplyr)
  data %>%
  mutate(loess = predict(loess(y ~ x, data = data))) %>%
  ggplot(aes(x, y)) +
  geom_point(color = "grey50") +
  geom_line(aes(y = loess))

Лессовая линия с ‹code›predict()‹/code› и ‹code›geom_line()‹/code›

Обновление: добавлена ​​строка кода для загрузки предоставленных данных примера. Обновление 2: исправление имени функции geom_smoot() в соответствии с комментарием @phi.

person gavg712    schedule 07.09.2017
comment
Комментируя старый пост, я решил указать, что в коде есть опечатка. geom_smoth должен быть geom_smooth. Поскольку опечатки в коде делают код неработоспособным, на это стоит обратить внимание. - person Phil; 13.11.2018