数据框上的平滑功能

时间:2016-02-05 08:18:18

标签: r

  

我尝试使用各种平滑功能,但找不到合适的功能。   我有一个从csv文件读入的数据框,其中包含传感器数据并且每行都有一个日期时间戳:

df
#datetime value1 value2 value3 ...
#2015-10-2 05-10-12 0.1 1000 28 ...
#2015-10-2 05-10-14 0.21 2500 17 ...
#2015-10-2 05-10-19 0.52 1700 37 ...
#2015-10-2 05-11-01 0.31 1530 42 ...
#2015-10-2 05-11-03 0.25 1956 33 ...
#2015-10-2 05-11-10 0.63 2750 22 ...
#2015-10-2 05-11-30 0.23 322 32 ...
#2015-10-2 15-00-43 0.12 933 17 ...
#2015-10-3 10-43-52 0.03 3244 43 ...
#2015-10-3 12-11-45 0.73 2334 12 ...
#2015-10-4 00-32-34 0.54 2321 27 ...
...
  

如您所见,datetime列没有固定间隔。我认为那是一个问题。   现在我想平滑数据框列value1。

好的,我的问题已被搁置,所以我想详细询问一下。 对不起,我是R的新手(几天以后),也是这个论坛的新手(从昨天开始),所以我必须为我的问题不够清楚并且不了解每个格式规则而道歉。但我会尽力参与其中!

我从此页https://stats.stackexchange.com/questions/30975/how-to-add-non-linear-trend-line-to-a-scatter-plot-in-r中选择了一个示例:

n <- 10
x <-seq(n)
y <- rnorm(n, 50 + 30 * x^(-0.2), 1)
Data <- data.frame(x,y)

plot(y ~ x, Data)

loess_fit <- loess(y ~ x, Data)
lines(Data$x, predict(loess_fit), col = "blue")

nls_fit <- nls(y ~ a + b * x^(-c), Data, start = list(a = 80, b = 20, c = 0.2))
lines(Data$x, predict(nls_fit), col = "red")

此示例显示如何向值显示添加平滑趋势线。

现在我的问题是我没有x的后续数值,但我有日期时间值。 所以我将上面的例子修改为:

x <- strptime(c("2015-10-02 11:07:43", "2015-10-02 12:09:45", "2015-10-02 15:10:10", "2015-10-02 18:00:23",
"2015-10-02 22:31:12", "2015-10-03 02:01:53", "2015-10-03 02:05:52", "2015-10-03 04:12:37",
"2015-10-03 07:47:08", "2015-10-03 11:43:41"), format = "%Y-%m-%d %H:%M:%S")
Data <- data.frame(x,y)

plot(y ~ x, Data)

loess_fit <- loess(y ~ x, Data)
lines(Data$x, predict(loess_fit), col = "blue")

nls_fit <- nls(y ~ a + b * x^(-c), Data, start = list(a = 80, b = 20, c = 0.2))
lines(Data$x, predict(nls_fit), col = "red")

如果我运行此示例,我会在行中出现错误

loess_fit <- loess(y ~ x, Data)

话说:

Error in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
(converted from warning) NAs introduced by coercion

是否有任何暗示这些数据的平滑趋势?

1 个答案:

答案 0 :(得分:1)

help("loess")指定函数需要一个&#34;数字响应和一到四个数字预测器&#34;。 POSIXlt变量不是数字变量。但是,这有效:

loess_fit <- loess(y ~ as.numeric(x), Data)
lines(Data$x, predict(loess_fit), col = "blue")

PS:我通常建议避免使用POSIXlt并使用as.POSIXct代替strptime。您还应始终明确指定时区。