首页 > 解决方案 > 如何在将平滑数据值分配到新数据框中的同时平滑数据?

问题描述

我有一组我重新采样的数据,是否有一个函数命令可以在 R 中使用以首先平滑数据,然后才从创建的数据框创建图形?

我的数据有很多噪音,在我重新采样数据之后,现在我想平滑数据,我使用geom_smooth来生成数据的图形,但该命令只创建平滑的图形表示输出数据,而不给出它所代表的点的值。


use ggplot
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,因为在我尝试过的所有平滑方法中,这是最接近我想要的结果以最小的误差或与原始数据的差异进行平滑。

这是head(rs)和的打印输出glimpse(rs)

> head(rs)
        Date  DLTime   Time24   RH Temp PM2.5     CO2    MCO2 MPM25                   t
1 21/05/2019 8:33:21 15:21:36 73.5 25.9    34 1096.88 1096.88    34 2019-05-21 15:21:36
2 21/05/2019 8:56:33 15:44:48 75.4 25.6    32  975.00  975.00    32 2019-05-21 15:44:48
3 21/05/2019 8:22:43 15:10:58 75.9 26.1    59 1068.75 1068.75    59 2019-05-21 15:10:58
4 21/05/2019 8:51:53 15:40:08 74.7 25.6    45  975.00  975.00    45 2019-05-21 15:40:08
5 21/05/2019 8:47:30 15:35:45 75.0 25.7    40 1006.25 1006.25    40 2019-05-21 15:35:45
6 21/05/2019 8:35:59 15:24:14 73.7 25.8    32 1984.38 1068.75    32 2019-05-21 15:24:14
> glimpse(rs)
Observations: 715
Variables: 10
$ Date   <fct> 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019, 21/05/2019,...
$ DLTime <fct> 8:33:21, 8:56:33, 8:22:43, 8:51:53, 8:47:30, 8:35:59, 8:17:13, 8:57:42, 8:20:34, 8:48:21, 8:34:...
$ Time24 <fct> 15:21:36, 15:44:48, 15:10:58, 15:40:08, 15:35:45, 15:24:14, 15:05:28, 15:45:57, 15:08:49, 15:36...
$ RH     <dbl> 73.5, 75.4, 75.9, 74.7, 75.0, 73.7, 76.6, 75.1, 75.6, 75.1, 74.4, 75.6, 73.8, 76.6, 73.9, 76.3,...
$ Temp   <dbl> 25.9, 25.6, 26.1, 25.6, 25.7, 25.8, 26.2, 25.6, 26.1, 25.7, 25.9, 25.8, 25.4, 26.2, 25.5, 26.2,...
$ PM2.5  <int> 34, 32, 59, 45, 40, 32, 42, 34, 35, 45, 36, 33, 29, 42, 46, 36, 42, 33, 35, 33, 39, 32, 39, 35,...
$ CO2    <dbl> 1096.88, 975.00, 1068.75, 975.00, 1006.25, 1984.38, 1328.13, 946.88, 1068.75, 1328.13, 1434.38,...
$ MCO2   <dbl> 1096.88, 975.00, 1068.75, 975.00, 1006.25, 1068.75, 1037.50, 946.88, 1068.75, 1021.88, 1112.50,...
$ MPM25  <dbl> 34, 32, 59, 45, 40, 32, 42, 34, 35, 45, 36, 33, 29, 42, 46, 36, 42, 33, 35, 33, 39, 32, 39, 35,...
$ t      <dttm> 2019-05-21 15:21:36, 2019-05-21 15:44:48, 2019-05-21 15:10:58, 2019-05-21 15:40:08, 2019-05-21...

我也试过

ml <- with(rs, loess(formula = y~log(x), span = 0.5))

mp <- predict(ml)

但它导致了这个错误信息

ml <- loess(formula = y~log(x), with(rs), span = 0.5)
Error in eval(substitute(expr), data, enclos = parent.frame()) : 
  argument is missing, with no default

我真的不明白我哪里出错了,因为我通过互联网完成的任何故障排除都没有真正给我一个明确的答案。如果还有其他方法,请告诉我。

我很抱歉没有给出一个可重复的例子,我在学习 R 方面还不够远,我可以创建一个随机数据,任何帮助表示赞赏,在此先感谢。

标签: rggplot2dplyrplotly

解决方案


如上所述,该loess函数与平滑数据的作用相同geom_smooth(method = "loess"),然后当模型传递给该predict函数时,您会得到一个新因变量的向量。您可以将这些绘制在图表上以检查:

library(dplyr)
library(ggplot2)

a <- rnorm(100)
b <- rnorm(100, mean = 4, sd = 20)*a

df <- tibble(a,b)

df_predict <- df[,"a"]

df_predict[,"b"] <- df %>%
  loess(b ~ a, data = ., span = 0.5) %>% 
  predict()

df %>%
  ggplot(aes(a,b)) +
  geom_point(col = "blue") +
  geom_smooth(method = "loess", span = 0.5, col = "red") +
  geom_point(data = df_predict, col = "red")

df_predict

# A tibble: 100 x 2
        a       b
    <dbl>   <dbl>
 1  0.116   0.502
 2  0.870  -3.44 
 3  0.336   1.16 
 4 -1.16   -9.32 
 5  1.73    8.88 
 6  0.236   0.756
 7  0.485   0.302
 8 -1.13   -9.58 
 9 -0.778 -10.1  
10 -2.76   11.9  
# ... with 90 more rows

这给出了下图,原始数据以蓝色绘制,函数的红线和公式中geom_smooth的红点用于给出数据框:loesspredictdf_predict

在此处输入图像描述


推荐阅读