r - 如何在将平滑数据值分配到新数据框中的同时平滑数据?
问题描述
我有一组我重新采样的数据,是否有一个函数命令可以在 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 方面还不够远,我可以创建一个随机数据,任何帮助表示赞赏,在此先感谢。
解决方案
如上所述,该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
的红点用于给出数据框:loess
predict
df_predict
推荐阅读
- spring-boot - 如何覆盖默认的 Spring Boot 登录页面?
- javascript - jQuery $.each 上动态添加元素到 DOM
- javascript - 未捕获的 ReferenceError:未定义要求;当 nodeIntegration 设置为 false
- sql - SQL:从两个表中取出一列并将它们放入一个预定义的表中
- php - 将 Wordpress 上传文件夹更改为根目录
- zeromq - 从 NetMQ ZeroMQ 了解 MajorDomo 模式
- python-3.x - 将地址转换为国家
- javascript - Pie chart.js - 显示无数据保存消息
- multidimensional-array - 如何在 PHP 中的多维数组中不创建编号索引的情况下推入数组?
- python - Python中有什么快速创建和访问哈希表的方法吗?