【问题标题】:Calculating Start for stl()计算 stl() 的开始
【发布时间】:2010-12-15 20:15:40
【问题描述】:

我正在从 .csv 数据文件中读取每周数据。数据样本为:

Date,Demand    
"Feb 08, 1991",6621    
"Feb 15, 1991",6433    
"Feb 22, 1991",6582   
"Mar 01, 1991",7224   
"Mar 08, 1991",6875   
"Mar 15, 1991",6947   
"Mar 22, 1991",7328   
"Mar 29, 1991",6777   
"Apr 05, 1991",7503
.....  

我的代码是:

> temp<-read.table(file="E:\\Data\\Demand_00.csv",header=TRUE, sep=",")
> stadat<-strptime(as.character(temp[,1]),"%b %d, %Y")[1]
> statim<-as.numeric(strftime(stadat,"%Y"))+(as.numeric(strftime(stadat,"%j"))/366)
> temdat<-ts(temp[,2],start=statim,frequency=52)
> plot(temp2<- stl(log(temdat), "per"))

我的问题是:是否有更好/更清洁的方式来构建 statim(上述 ts 对象中所需的开始)?请注意,这是每周数据,可能会或可能不会从一年的第一周开始。

谢谢,
比尔

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    你可以使用 zoo 包来简化这个:

    File <- E:\\Data\\Demand_00.csv"
    
    library(zoo)
    fmt <- "%b %d, %Y"
    
    year.jul <- function(x) as.numeric(format(x, "%Y")) + 
        as.numeric(format(x, "%j"))  / 366
    z0 <- read.zoo(File, header = TRUE, sep = ",", FUN = as.Date, format = fmt,
        FUN2 = year.jul)
    ts(z0, start = start(z0), frequency = 52)
    

    另一方面,您可能希望在 Epi 包中使用 cal.yr,而不是将其强制为 366 天:

    library(Epi)
    z2 <- read.zoo(File, header = TRUE, sep = ",", FUN = cal.yr, format = fmt)
    as.ts(z2)
    

    【讨论】:

    • 谢谢,很好的答案。我真的很喜欢你的第二个答案。但是, as.ts(z2) 语句将 ts 频率设置为非整数(在我的情况下,频率 = 52.17857)。这给出了来自 stl() 的季节性/剩余值的奇怪组合。我使用了 temdat
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 2020-07-20
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多