如何绘制时间序列的一阶差分

3
我知道这很基础,但是我似乎无法使代码工作。 我有一个时间序列数据集,我尝试通过取第一差分来使其稳定,但是我不知道在R中要使用什么代码来实现。 数据不在库中; 我只将其导入为CSV文件。
我尝试的方法是plot(diff(data), type="o", main="first difference") ,但我得到错误消息:

Error in r[i1] - r[-length(r):-(length(r) - lag + 1L)] : non-numeric argument to binary operator`

我是R的新手,所以我不知道这意味着什么。
> dput(hotel)
structure(list(Month = 1:168, Occupancy = c(501L, 488L, 504L, 
578L, 545L, 632L, 728L, 725L, 585L, 542L, 480L, 530L, 518L, 489L, 
528L, 599L, 572L, 659L, 739L, 758L, 602L, 587L, 497L, 558L, 555L, 
523L, 532L, 623L, 598L, 683L, 774L, 780L, 609L, 604L, 531L, 592L, 
578L, 543L, 565L, 648L, 615L, 697L, 785L, 830L, 645L, 643L, 551L, 
606L, 585L, 553L, 576L, 665L, 656L, 720L, 826L, 838L, 652L, 661L, 
584L, 644L, 623L, 553L, 599L, 657L, 680L, 759L, 878L, 881L, 705L, 
684L, 577L, 656L, 645L, 593L, 617L, 686L, 679L, 773L, 906L, 934L, 
713L, 710L, 600L, 676L, 645L, 602L, 601L, 709L, 706L, 817L, 930L, 
983L, 745L, 735L, 620L, 698L, 665L, 626L, 649L, 740L, 729L, 824L, 
937L, 994L, 781L, 759L, 643L, 728L, 691L, 649L, 656L, 735L, 748L, 
837L, 995L, 1040L, 809L, 793L, 692L, 763L, 723L, 655L, 658L, 
761L, 768L, 885L, 1067L, 1038L, 812L, 790L, 692L, 782L, 758L, 
709L, 715L, 788L, 794L, 893L, 1046L, 1075L, 812L, 822L, 714L, 
802L, 748L, 731L, 748L, 827L, 788L, 937L, 1076L, 1125L, 840L, 
864L, 717L, 813L, 811L, 732L, 745L, 844L, 833L, 935L, 1110L, 
1124L, 868L, 860L, 762L, 877L)), .Names = c("Month", "Occupancy"
), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-168L), spec = structure(list(cols = structure(list(Month = structure(list(), class = c("collector_integer", 
"collector")), Occupancy = structure(list(), class = c("collector_integer", 
"collector"))), .Names = c("Month", "Occupancy")), default = structure(list(), class = c("collector_guess", 
"collector"))), .Names = c("cols", "default"), class = "col_spec"))

你能提供一小部分数据来帮助解决问题吗?看起来你的数据可能包含非数字值,每当你尝试进行二元运算(即加法、减法、乘法、除法、指数运算)时就会出现错误。 - kpg987
哈哈,我在这里没有发过多少帖子。我不知道格式是否会保持完好或者是否难以阅读,所以我选择了安全的方式。 - katie
1
啊。当我们请求数据和/或代码时,通常是为了在我们这一端使用它。发布照片意味着我们必须将其转录,这是一项繁琐的工作。有时屏幕截图可以传达一些直接文本无法传达的内容,但这更多是例外。在这种情况下,最好的方法是您发布运行dput(data)时得到的任何内容。在编辑窗口中突出显示代码并按{ }按钮进行格式化。 - AkselA
好的,我已经发布了dput(hotel)的输出,并删除了截图,因为这是针对不同数据集的。 - katie
所有数据点后面为什么会有L??当我在Excel中查看数据时,没有L。我猜这是它警告我的非数字参数。 - katie
显示剩余3条评论
3个回答

2

TS

问题在于你有一个R数据框架

class(employment)
## [1] "tbl_df"     "tbl"        "data.frame"

虽然可以使用该表示法进行工作,但如果您使用R时间序列对象(如ts对象或来自zoo包的zoo对象),则会更容易。

以下是将数据框转换为ts对象,然后对其日志进行第一次差分并绘制图形的过程。由于时间为1、2、3等,这是默认设置,因此在创建ts对象empts时不必指定时间。

empts <- ts(employment$employmentW)
plot(diff(log(empts)))

(图片后续)

在此输入图片描述

数据框

如果您想保留数据框表示,则可以尝试以下方法。请注意,diff会将长度减少一个元素,因此我们删除Month的第一个元素,以使x和y部分具有相同的长度,这样我们就可以绘制对数的一阶差分,而2、3、4等则是自动处理的时间序列表示,但不是数据框表示,因此我们必须手动处理。

plot(diff(log(employmentW)) ~ Month[-1], employment, type = "l")

谢谢!你能帮我写一下去除季节性的代码吗?我需要拟合一个ARMA模型,但是我发现自相关函数每12个滞后期就会出现峰值。 - katie

1
这里有一个使用tidyverse方法的解决方案。
原始数据:
head(hotel)
# # A tibble: 6 x 2
#   Month Occupancy
#   <int>     <int>
# 1     1       501
# 2     2       488
# 3     3       504
# 4     4       578
# 5     5       545
# 6     6       632

计算每个月之间占用率的差异:

library(dplyr)
hotel_diff <- 
  hotel %>%
  mutate(Difference = Occupancy - lag(Occupancy)) %>%
  na.omit() # to remove the first row which has an NA

head(hotel_diff)
# # A tibble: 6 x 3
#   Month Occupancy Difference
#   <int>     <int>      <int>
# 1     2       488        -13
# 2     3       504         16
# 3     4       578         74
# 4     5       545        -33
# 5     6       632         87
# 6     7       728         96

剧情:

library(ggplot2)
ggplot(hotel_diff, aes(Month, Difference)) + geom_line()

enter image description here

如果您是R的新手,我强烈建议您跳过基础R数据整理和绘图函数,直接使用tidyverse包,例如dplyrggplot2。这样会让您的生活更加轻松。关于这个主题有一本很棒的免费书籍可以参考:R for Data Science.

谢谢。我看到差分图仍然不平稳,所以我选择了一个不同的数据集作为第一次差分的平稳数据集。当我执行你所做的操作时,这是我得到的错误信息:> library(dplyr) > snow_diff <- + snow %>% + mutate(difference = snow-lag(snow)) %>% + na.omit() Error in mutate_impl(.data, dots) : Column difference must be length 63 (the number of rows) or one, not 2 - katie

1

简化的基本R代码(使用log(),因为您在稍后的几乎相同的帖子中请求它):

plot(diff(log(hotel$Occupancy)), type="o", main="first difference")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接