GGPLOT: Как я могу построить кривые лесса для определенных подмножеств моих точек данных? - PullRequest
1 голос
/ 13 июля 2020

(Я самоучка в R и часто использую этот форум, но это мой первый пост. Мы будем благодарны за обратную связь.)

Это должно иметь относительно простое решение, но я не могу найти это заставляет меня выбросить мой компьютер в окно. По сути, у меня есть простой набор данных:

mydata <- structure(list(Date = c("2020-06-22", "2020-06-22", "2020-06-23", 
"2020-06-23", "2020-06-24", "2020-06-24", "2020-06-25", "2020-06-25", 
"2020-06-26", "2020-06-26", "2020-06-29", "2020-06-29", "2020-06-30", 
"2020-06-30", "2020-07-01", "2020-07-01", "2020-07-02", "2020-07-02", 
"2020-07-06", "2020-07-06", "2020-07-06", "2020-07-06", "2020-07-07", 
"2020-07-07", "2020-07-08", "2020-07-08", "2020-07-08", "2020-07-09", 
"2020-07-09", "2020-07-09"), Location = c("Haskell", "Bustamante", 
"Haskell", "Bustamante", "Haskell", "Bustamante", "Bustamante", 
"Haskell", "Bustamante", "Haskell", "Bustamante", "Haskell", 
"Bustamante", "Haskell", "Bustamante", "Haskell", "Bustamante", 
"Haskell", "Bustamante", "Haskell", "Bustamante", "Haskell", 
"Bustamante", "Haskell", "Bustamante", "Haskell", "Tap Water", 
"Bustamante", "Haskell", "Tap Water"), UVT = c(72.2, 65.6, 70, 
61.8, 71.5, 63.9, 63.9, 71.5, 68.1, 71.5, 68.9, 71.3, 71.3, 72.4, 
68.9, 67.3, 49.4, 49, 39.3, 42.3, 64.2, 70.9, 33.3, 49.3, 46, 
48.8, 88.7, 66, 70.5, 84.7), Source = c("Shawn", "Shawn", "Jesus", 
"Jesus", "Jesus", "Jesus", "Jesus", "Jesus", "Jesus", "Jesus", 
"Jesus", "Jesus", "Jesus", "Jesus", "Jesus", "Jesus", "Jesus", 
"Jesus", "Jesus", "Jesus", "Shawn", "Shawn", "Jesus", "Jesus", 
"Jesus", "Jesus", "Jesus", "Jesus", "Jesus", "Jesus")), row.names = c(NA, 
-30L), class = "data.frame")

Сначала я попытался построить группировку данных по местоположению, но я предполагаю, поскольку группа «Водопроводная вода» имеет только 2 точки данных, он не соответствует требованиям в градусах:

#Import Packages
library(tidyverse)

#Import Data
mydata <- read.csv("L:\\2019\\19W06195 - EPW HRS and RRB WWTPs Disinfection Study\\Design\\Design Criteria\\R\\UVT Graphs\\UVTdata.csv")

#Plot
p <- ggplot(data=mydata, aes(x=as.Date(mydata[,1], "%Y-%m-%d"), y=mydata[,3], color=mydata[,2])) + geom_point() + geom_smooth(method = "loess", se = FALSE)

p + scale_x_date(date_breaks = "days" , date_labels = "%b-%d")

Попытка построения # 1

Это полученная мной ошибка:

Warning messages:
1: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  span too small.   fewer data values than degrees of freedom.
2: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  at  18451
3: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  radius  2.5e-005
4: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  all data on boundary of neighborhood. make span bigger
5: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  pseudoinverse used at 18451
6: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  neighborhood radius 0.005
7: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  reciprocal condition number  1
8: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  at  18452
9: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  radius  2.5e-005
10: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  all data on boundary of neighborhood. make span bigger
11: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  There are other near singularities as well. 2.5e-005
12: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  zero-width neighborhood. make span bigger
13: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  ... :
  zero-width neighborhood. make span bigger
14: Computation failed in `stat_smooth()`:
NA/NaN/Inf in foreign function call (arg 5)

Обратите внимание, что запуск этого же кода, но указание rater «method = lm», а не «method = loess», работает отлично, но не показывает желаемую тенденцию.

модель линейной регрессии

Чтобы исправить это, я попытался установить условие по умолчанию на линейную регрессию для подмножеств данных со слишком небольшим количеством точек данных:

sProduct <- unique(mydata[,2])
p <- ggplot(mydata, aes(as.Date(mydata[,1], "%Y-%m-%d"), mydata[,3], color = mydata[,2])) + geom_point()

for (i in sProduct){

  sMethod <- ifelse(sum(mydata[,2] == i) <= 5, "lm", "loess")
  p <- p + geom_smooth(data = subset(mydata, mydata[,2] == i), method = sMethod, se = FALSE)
}

p

Несмотря на эти усилия, теперь я получаю aestheti c error:

Error: Aesthetics must be either length 1 or the same as the data (14): x, y and colour
Run `rlang::last_error()` to see where the error occurred.

Я предполагаю, что это связано с несогласованностью количества точек данных между geom_points и подмножествами данных в geom_smooth, но я не уверен. Я также попытался настроить подмножества данных, чтобы исключить «Водопроводную воду» из geom_smooth, так как меня вообще не интересует тенденция там:

p <- ggplot(data=mydata, aes(x=as.Date(mydata[,1], "%Y-%m-%d"), y=mydata[,3], color=mydata[,2])) + geom_point() + geom_smooth(data=subset(mydata, Location=="Bustamante" | Location=="Haskell"), method = "loess", se = FALSE)
p + scale_x_date(date_breaks = "days" , date_labels = "%b-%d")

Это дает ту же ошибку. Любая помощь здесь будет принята с благодарностью! Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Попробуйте formula='y ~ x' в geom_smooth как

geom_smooth(method = "loess", formula='y ~ x', se = FALSE)

Тогда вы получите следующий результат (даты здесь не отформатированы):

вывод

0 голосов
/ 13 июля 2020

Просто сопоставьте имена переменных с эстетикой вместо того, чтобы помещать столбцы df внутри aes().

library(dplyr)
library(ggplot2)

mydata1 <- mydata %>% 
  mutate(Date = as.Date(Date, "%Y-%m-%d")) %>% 
  add_count(Location) %>% 
  mutate(method = ifelse(n <= 5, "lm", "loess"))

p <- ggplot(data=mydata1, aes(x=Date, y=UVT, color=Location)) + 
  geom_point()

p + 
  geom_smooth(data = filter(mydata1, method == "loess"), method = "loess", se = FALSE) +
  geom_smooth(data = filter(mydata1, method == "lm"), method = "lm", se = FALSE)
#> `geom_smooth()` using formula 'y ~ x'
#> `geom_smooth()` using formula 'y ~ x'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...