gpt4 book ai didi

r - 尝试在 R 中使用 STL 和分解函数时出错

转载 作者:行者123 更新时间:2023-12-03 23:47:53 24 4
gpt4 key购买 nike

我做了一个简单的时间序列,我给 sin 函数添加了一点噪音,并尝试使用 R 中的“STL”和“decompose”函数来分解它,而我的系列肯定有超过 2 个周期并且是周期性的,R这两个函数都给了我以下错误:

x
[1] 1.4537365796 2.7185844368 2.8394728999 3.8926989923 4.3405508086 5.1959080871
[7] 5.6602505790 5.4829985648 5.6357660330 4.6084976233 4.6617322922 4.0286486832
[13] 3.3641752333 1.7408063182 0.8815147612 0.2895139342 -0.5402768515 -1.5612641107
[19] -2.1584502547 -2.9878043526 -3.5545638149 -4.0530074199 -4.0748538612 -4.7581704662
[25] -4.6555349052 -4.0726206240 -3.1646413472 -2.6934453823 -2.2364605277 -1.2643569882
[31] -0.1202011946 1.1136371449 2.2504199271 3.0313528996 3.5384449109 4.5176211013
[37] 5.4013172839 5.4252837451 5.4768196692 5.8979709077 5.6698285659 4.5133489450
[43] 4.2702602998 3.5180837069 2.2652913344 1.1975595698 0.5412697849 -0.5966162032
[49] -1.0827728340 -1.8488242277 -3.4118061838 -3.9009752140 -3.9102671954 -4.3486102172
[55] -4.7481017993 -4.0097598695 -3.9078554267 -3.8070416888 -2.5968567322 -2.2567568949
[61] -1.1423907008 0.0002492447 0.4338279080 1.2431986797 2.3216397323 3.3235925116
[67] 4.1591487169 4.9028481873 5.4535861470 5.0579349546 5.1548777627 4.9707124992
[73] 5.4496833187 4.4563072487 4.1301372986 2.4594352788 1.7253019929 0.6961453965
[79] 0.4281167695 -1.3152944759 -1.8645880957 -2.5764132038 -3.7681528112 -4.3731672862
[85] -3.9940201611 -4.5497596299 -4.9496796983 -4.1233093447 -3.7759837204 -3.3359027749
[91] -2.3518009102 -1.7488933797 -0.7225148838 0.5395759836 1.0496249652 2.0383715782
[97] 3.2357449979 3.8028316517 5.0346866280 5.2154265148

fit<- stl(x, t.window=15, s.window="per", robust=TRUE)
Error in stl(x, t.window = 15, s.window = "per", robust = TRUE) :series is not periodic or has less than two periods

fit<- decompose(x,type="multiplicative")
Error in decompose(x, type = "multiplicative") :time series has no or less than 2 periods

有人会帮我解决这个问题吗?

最佳答案

从错误消息中是不是很明显:

time series has no or less than 2 periods

? R 并没有告诉你你的数据不是周期性的,只是你通过它的数据没有迹象表明它们是周期性的。

您的时间序列 x从 R 的角度来看没有周期性。看起来你忘记告诉,或者在告诉时出错, ts()什么是周期性。由于你没有展示如何 x已创建,我们无能为力,只能告诉您返回创建 x所以它确实有> = 2个周期。

这里的重点是,R 本身无法推断出每单位时间的观察频率是多少。你要告诉 ts()那个信息。您可以通过多种方式执行此操作:

frequency: the number of observations per unit of time.

deltat: the fraction of the sampling period between successive observations; e.g., 1/12 for monthly data. Only one of frequency or deltat should be provided.



如果您不提供其中之一, ts()使用默认值 frequency = 1 , deltat = 1这将表示每单位时间(例如每年一次)的一次观察的时间序列。
stl()需要 "ts"分类对象 - 如果您不提供,它会将输入数据强制转换为 "ts"对象通过 as.ts() .这个函数将使用我上面描述的默认值。

我认为这里发生的事情是你没有意识到 stl()需要 "ts" class object 也不是在您刚刚提供观察向量时它为您的数据创建了一个不合适的对象。

解决方案是显式创建 "ts"通过 ts() 分类对象并指定 frequency 之一或 deltat .

例如。
dat <- cumsum(rnorm(12*4))
x <- ts(dat)
stl(x, "periodic")
xx <- ts(dat, frequency = 12)
stl(xx, "periodic")

这里我用了 frequency = 12表示每单位时间有 12 个观测值——例如使用月度数据。

以上给了我
R> stl(x, "periodic")
Error in stl(x, "periodic") :
series is not periodic or has less than two periods

R> stl(xx, "periodic")
Call:
stl(x = xx, s.window = "periodic")

Components
seasonal trend remainder
Jan 1 -0.103529 0.55245 -0.44301
Feb 1 0.001333 0.56981 0.86135
Mar 1 -0.382075 0.58717 1.11162
Apr 1 0.010552 0.59891 -1.04966
....

对于您的数据,我怀疑您想要 frequency = 10给定时间序列的长度;那就是说你每年有十次观察。如果该系列每年有更多的观测值,比如每月数据有 12 个,但您没有最近两个月或前两个月(即没有缺失数据, NA s),您只是在稍后(更早)开始(结束) ),因此在该系列的一端或两端没有整年的数据。

关于r - 尝试在 R 中使用 STL 和分解函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com