- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
包 bfast 中的 bfast()
函数应该能够检测长期趋势的断点和季节性成分的变化。一个示例是这张图 ( source ):
在此图中,子图没有。图 2 显示检测到的季节性变化,而没有。图 3 显示了趋势中的断点。
但是,我不明白如何告诉 bfast()
寻找季节性变化/断点。我得到的只是长期趋势中的断点。这是一个可重现的示例,它模拟一个 50 年的时间序列,每周测量季节性变量 y
(即每年 52 次测量):
n_years <- 50
freq <- 52
y_pattern <- sin(seq(0, 2*pi, length = freq))
y <- rep(y_pattern, n_years) + rnorm(freq*n_years, sd = 0.1)
mydata <- data.frame(Year = rep(1:n_years, each = freq), Week = rep(1:freq, n_years), y)
这些数据显示了数据中恒定的季节性趋势,年度峰值在第 13 周左右。现在,让我们介绍第 25 年的季节性变化,将第 26-59 年的季节性周期推迟 8 周:
move_data <- function(data, year, weeks_to_move){
x <- data[data$Year == year, "y"]
c(x[seq(52 - weeks_to_move + 1,52)], x[seq(1, 52 - weeks_to_move)])
}
mydata$y_shifted <- mydata$y
for (year in 26:50){
mydata$y_shifted[mydata$Year == year] <- move_data(mydata, year, weeks_to_move = 8)
}
变量 y_shifted
现在在 1-25 年的第 13 周左右和 26-52 年的第 21 周左右出现年度峰值。让我们绘制它,与“未移位”变量 y
进行比较:
mydata$Phase <- ifelse(mydata$Year <= 25, "Year 1-25", "Year 26-50")
mydata %>%
tidyr::gather("y_variable", "value", y, y_shifted) %>%
ggplot(aes(Week, value, group = Year, color = Phase)) + geom_line() +
facet_grid(.~y_variable)
[
这种季节性的突然转变应该很容易被发现。然而,当我运行 `bfast() 时,它没有检测到任何变化:
y_ts <- ts(mydata$y_shifted, start = c(1,1), frequency = freq)
fit <- bfast(y_ts, h=.15, season="harmonic", max.iter=20, breaks=3)
plot(fit)
如您所见,未检测到季节性变化(上面的子图 2)。残差(子图 4)反射(reflect)了季节性的变化,如果我们按一年中的某一天绘制残差,这一点就很明显了:
mydata$Residuals <- fit$output[[1]]$Nt
ggplot(mydata, aes(Week, Residuals, group = Year, color = Phase)) + geom_point()
我觉得我需要更改一些参数或选项,以便让 bfast()
查找季节性变化,但是哪个?我无法从文档中挖掘出这些信息。
最佳答案
我在对我的消费者组合数据测试 bfast
时遇到了同样的问题,但未能找到任何真正的解决方案。我继续深入研究地球传感社区的 bfast 文献,这是 bfast
首次开发和广泛使用的地方。我的理解是,要使早餐始终符合有用的季节性成分,您几乎无能为力。
几天前,我在 the best software for time series analysis 上遇到了这个 Quora 讨论发现有一个新的 R 包 Rbeast
用于断点检测和时间序列分解。还有一条很好的推文显示了快速比较 between bfast and Rbeast .
经过一些试验,我发现 Rbeast
能够在我和你的数据中找出季节性断点。坦率地说,我仍然不知道 Rbeast
是如何工作的。 Rbeast
中的 BEAST 算法看起来相当复杂,有大量的输出;它没有很好的文档记录,也不像 bfast 那样容易使用。让我展示一下我得到的结果,首先使用您的数据,然后使用第二个人工时间序列。
# The original code to generate your data
n_years <- 50
freq <- 52
y_pattern <- sin(seq(0, 2*pi, length = freq))
y <- rep(y_pattern, n_years) + rnorm(freq*n_years, sd = 0.1)
mydata <- data.frame(Year = rep(1:n_years, each = freq), Week = rep(1:freq, n_years), y)
move_data <- function(data, year, weeks_to_move){
x <- data[data$Year == year, "y"]
c(x[seq(52 - weeks_to_move + 1,52)], x[seq(1, 52 - weeks_to_move)])
}
mydata$y_shifted <- mydata$y
for (year in 26:50){
mydata$y_shifted[mydata$Year == year] <- move_data(mydata, year, weeks_to_move = 8)
}
# You data analyzed by the BEAST algorithm in Rbeast
library(Rbeast)
fit <- beast(mydata$y_shifted, freq=52)
print(fit)
plot(fit)
#####################################################################
# Seasonal Changepoints #
#####################################################################
.-------------------------------------------------------------------.
| Ascii plot of probability distribution for number of chgpts (ncp) |
.-------------------------------------------------------------------.
|Pr(ncp = 0 )=0.000|* |
|Pr(ncp = 1 )=0.999|*********************************************** |
|Pr(ncp = 2 )=0.001|* |
|Pr(ncp = 3 )=0.000|* |
|Pr(ncp = 4 )=0.000|* |
|Pr(ncp = 5 )=0.000|* |
|Pr(ncp = 6 )=0.000|* |
|Pr(ncp = 7 )=0.000|* |
|Pr(ncp = 8 )=0.000|* |
|Pr(ncp = 9 )=0.000|* |
|Pr(ncp = 10)=0.000|* |
.-------------------------------------------------------------------.
| Summary for number of Seasonal ChangePoints (scp) |
.-------------------------------------------------------------------.
|ncp_max = 10 | MaxSeasonKnotNum: A parameter you set |
|ncp_mode = 1 | Pr(ncp= 1)=1.00: There is a 99.9% probability |
| | that the seasonal component has 1 chgnpt(s). |
|ncp_mean = 1.00 | Sum{ncp*Pr(ncp)} for ncp = 0,...,10 |
|ncp_pct10 = 1.00 | 10% percentile for number of changepoints |
|ncp_median = 1.00 | 50% percentile: Median number of changepoints |
|ncp_pct90 = 1.00 | 90% percentile for number of changepoints |
.-------------------------------------------------------------------.
| List of probable seasonal changepoints ranked by probability of |
| occurrence: Please combine the ncp reported above to determine |
| which changepoints below are practically meaningful |
'-------------------------------------------------------------------'
|scp# |time (cp) |prob(cpPr) |
|------------------|---------------------------|--------------------|
|1 |1301.000000 |1.00000 |
.-------------------------------------------------------------------.
精确地检测到突然的季节性变化。 Rbeast 还给出了检测季节性和趋势断点的概率(上图中 Pr(scp) 和 Pr(tcp) 面板中的红色和绿色曲线)。检测到季节性变化的概率非常高,接近 1.0。你的数据趋势是一条平线。它本质上是一个零常数,并且在趋势中找到断点(即 Rbeast 中使用的变化点)的概率也始终接近于零。
Rbeast
的一个很酷的功能是估计谐波季节性模型的 sin 和 cos 阶数。下面,我生成了一个时间序列,该时间序列具有三个季节性段(即两次中断)加上一个没有中断的倾斜趋势。三个季节段的sin顺序不同,分别取1、2、3。
# Generate a sample time series with three seasonal segments
# the sin/cos orders for the three segs are different.
seg1 <- 1:1000
seg2 <- 1001:2000
seg3 <- 2001:3000
new_data <- c( sin(seg1*2*pi/52), 0.6*sin( seg2*2*pi/52*2), 0.3*sin( seg3*2*pi/52*3)) + (1:3000)*0.0002+ rnorm(3000, sd = 0.1)
# Test bfast using new_data
y_ts <- ts(new_data, start = c(1,1), frequency = 52)
fit <- bfast(y_ts, h=.15, season="harmonic", max.iter=20, breaks=3)
plot(fit)
令人惊讶的是,bfast
没有检测到任何季节性中断,尽管在绘制的数据 Yt
中很容易注意到这三个部分。
# Analyze the new_data time series using `Rbeast`
fit <- beast(new_data, freq=52)
print(fit)
plot(fit)
#####################################################################
# Seasonal Changepoints #
#####################################################################
.-------------------------------------------------------------------.
| Ascii plot of probability distribution for number of chgpts (ncp) |
.-------------------------------------------------------------------.
|Pr(ncp = 0 )=0.000|* |
|Pr(ncp = 1 )=0.000|* |
|Pr(ncp = 2 )=0.969|*********************************************** |
|Pr(ncp = 3 )=0.031|** |
|Pr(ncp = 4 )=0.000|* |
|Pr(ncp = 5 )=0.000|* |
|Pr(ncp = 6 )=0.000|* |
|Pr(ncp = 7 )=0.000|* |
|Pr(ncp = 8 )=0.000|* |
|Pr(ncp = 9 )=0.000|* |
|Pr(ncp = 10)=0.000|* |
.-------------------------------------------------------------------.
| Summary for number of Seasonal ChangePoints (scp) |
.-------------------------------------------------------------------.
|ncp_max = 10 | MaxSeasonKnotNum: A parameter you set |
|ncp_mode = 2 | Pr(ncp= 2)=0.97: There is a 96.9% probability |
| | that the seasonal component has 2 chgnpt(s). |
|ncp_mean = 2.03 | Sum{ncp*Pr(ncp)} for ncp = 0,...,10 |
|ncp_pct10 = 2.00 | 10% percentile for number of changepoints |
|ncp_median = 2.00 | 50% percentile: Median number of changepoints |
|ncp_pct90 = 2.00 | 90% percentile for number of changepoints |
.-------------------------------------------------------------------.
| List of probable seasonal changepoints ranked by probability of |
| occurrence: Please combine the ncp reported above to determine |
| which changepoints below are practically meaningful |
'-------------------------------------------------------------------'
|scp# |time (cp) |prob(cpPr) |
|------------------|---------------------------|--------------------|
|1 |2001.000000 |1.00000 |
|2 |1001.000000 |1.00000 |
|3 |1027.000000 |0.02942 |
.-------------------------------------------------------------------.
以上是Rbeast的结果。恢复了两个休息时间和三个季节性片段。 Rbeast
估计的季节性谐波阶数趋势没有中断。在上面的Order_s面板中,正确恢复了三个sin和cos阶数。 Order_s 曲线还显示了两个季节性中断的位置。
关于r - 使用 bfast 检测季节性成分的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708697/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!