Есть ли функция для сглаживания данных при выдаче значений в новый фрейм данных? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть набор данных, который я повторно выбрал, есть ли команда, которую я могу использовать в R, чтобы сначала сгладить данные, и только потом создавать график из созданного фрейма данных?.

В моих данных много шума, после повторной выборки данных, теперь я хочу сгладить данные, я использовал geom_smooth для создания графика данных, но команда только создает графическое представление сглаженных данных без указания значений представленных точек.

library(ggplot2)
library(dplyr)
library(plotly)

df <- read.csv("data.csv", header = T)

str(df)

rs <- sample_n(df,715)

q <- 
  ggplot(df,aes(x,y)) + 
  geom_line() + 
  geom_smooth(method = "loess", formula = y~log(x), span = 0.05)

Это то, что я использовал для сглаживания своих данных, я использовал loess, formula = y~log(x), span = 0.05, потому что из всех методов сглаживания, которые я пробовал, это самый близкий результат к тому, что я хочу, который сглаживает с наименьшим количеством ошибок или различий из исходных данных. Я прошу прощения за то, что не привел воспроизводимый пример, я недостаточно глубоко изучил R, чтобы я мог создавать случайные данные, любая помощь приветствуется, спасибо заранее.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы можете подогнать модель лесса к данным, а затем использовать прогноз для определения точек для построения.

library(tidyverse)   

# Generate some noisy data
x <- seq(1,100) 
y <- x + rnorm(100, sd = 20)

df <- tibble(x = x, y = y)

# plot with a smooth
df %>% 
  ggplot(aes(x,y)) +
  geom_point() +
  geom_smooth(method = "loess")

# Alteratively
m_loess <- loess(y ~ x, df) #fit a loess model
m_loess_pred <- predict(m_loess) # predict for each data point

df <- df %>% # add predictions to data frame for plotting
  add_column(m_loess_pred)  

df %>% # plot
  ggplot(aes(x,m_loess_pred)) +
  geom_point() 
0 голосов
/ 11 июля 2019

Этот ответ основан на данных imgur.com / a / L22T4BN

library(tidyverse)

# I've reproduced a subset of your data

df <- data.frame(Date = c('21/05/2019','21/05/2019','21/05/2019','21/05/2019','21/05/2019','21/05/2019','21/05/2019','21/05/2019','21/05/2019'),
  Time24 = c('15:45:22', 
             '15:18:11', 
             '15:22:10', 
             '15:18:38',
             '15:40:50',
             '15:51:42',
             '15:38:29',
             '15:20:20',
             '15:41:34'
             ),
                 MPM25 = c(46, 34, 57, 51, 31, 32,46,33,31))


glimpse(df)              
# Variables: 4
# $ Date     <fct> 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019
# $ Time24   <fct> 15:18:11, 15:18:38, 15:22:10, 15:40:50, 15:45:22, 15:51:42
# $ MPM25    <dbl> 34, 51, 57, 31, 46, 32
# $ datetime <dttm> 2019-05-21 15:18:11, 2019-05-21 15:18:38, 2019-05-21 15:22:10, 2019-0

# Note that the Date and Time24 are factors <fct>
# We can use these values to create a datetime object
# Also note the dates/time are out of order because they some from a random sample

df <- df %>%    
  mutate(datetime = str_c(as.character(Date), as.character(Time24), sep = ' ')) %>% # join date and time
  mutate(datetime = lubridate::dmy_hms(datetime)) %>% # convert to datetime object
  mutate(num_datetime = as.numeric(datetime)) %>% # numerical version of datetime required for loess fitting
  arrange(datetime)  # put times in order

# Take care with the time zone.  The function dmy_hms defaults to UTC. 
# You may need to use the timezone for your area e.g. for me it would be tz = 'australia/melbourne'


# we can then plot

df %>% 
  ggplot(aes(x = datetime, y = MPM25)) +
  geom_point() +
  geom_smooth(span = 0.9) # loess smooth


# fitting a loess 
m_loess <- loess(MPM25 ~ num_datetime, data = df, span = 0.9) #fit a loess model

# Create predictions

date_seq <- seq(from = 1558451891, # 100 points from the first to the late datetime
                to = 1558453902,
                length.out = 100)



m_loess_pred <- predict(m_loess, 
                        newdata = data.frame(num_datetime =  date_seq)) 


# To plot the dates they need to be in POSIXct format
date_seq <- as.POSIXct(date_seq, tz = 'UTC', origin = "1970-01-01")

# Create a dataframe with times and predictions
df_predict <- data.frame(datetime = date_seq, pred = m_loess_pred)


# Plot to show that geom_smooth and the loess predictions are the same
df %>% 
  ggplot(aes(x = datetime, y = MPM25)) +
  geom_point() +
  geom_smooth(span = 0.9, se = FALSE) +
  geom_point(data = df_predict, aes(x = datetime, y = pred) , colour = 'orange')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...