我遵循了另一篇文章中定义自相关函数的建议:
def autocorr(x):
result = np.correlate(x, x, mode = 'full')
maxcorr = np.argmax(result)
#print 'maximum = ', result[maxcorr]
result = result / result[maxcorr] # <=== normalization
return result[result.size/2:]
Run Code Online (Sandbox Code Playgroud)
但最大值不是"1.0".因此我引入了标有"<=== normalization"的行
我尝试了使用"时间序列分析"(Box - Jenkins)第2章数据集的函数.我希望得到像图的结果.那本书中的2.7.但是我得到了以下内容:

任何人都有这种奇怪的不期望的自相关行为的解释?
增加(2012-09-07):
我进入Python - 编程并执行以下操作:
from ClimateUtilities import *
import phys
#
# the above imports are from R.T.Pierrehumbert's book "principles of planetary
# climate"
# and the homepage of that book at "cambridge University press" ... they mostly
# define the
# class "Curve()" used in …Run Code Online (Sandbox Code Playgroud) 我正在使用 python 3.7。
我正在使用 ARIMA 模型进行时间序列预测。我正在使用自相关图评估 ARIMA 数据的属性 - 特别是使用 pandas.plotting 中的 autocorrelation_plot。
我的数据有 50,000 条左右的记录,这使得情节非常繁忙,很难找出任何特定的趋势。有没有办法限制 x 轴,使前几百个滞后更加集中?
我不能分享实际情节,但我的代码如下:
import pandas as pd
from pandas.plotting import autocorrelation_plot
#Import Data
time_series_2619 = pd.read_csv("Consumption/2619.csv", parse_dates=['Date/Time'], index_col = ['Date/Time'])['Recording']
#Auto Correlation Plot
autocorrelation_plot(time_series_2619)
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到任何内容。
我试图将信号中存在的周期性分解为其各个组成部分,以计算它们的时间周期。
假设以下是我的示例信号:
您可以使用以下代码重现信号:
t_week = np.linspace(1,480, 480)
t_weekend=np.linspace(1,192,192)
T=96 #Time Period
x_weekday = 10*np.sin(2*np.pi*t_week/T)+10
x_weekend = 2*np.sin(2*np.pi*t_weekend/T)+10
x_daily_weekly_sinu = np.concatenate((x_weekday, x_weekend))
#Creating the Signal
x_daily_weekly_long_sinu = np.concatenate((x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu,x_daily_weekly_sinu))
#Visualization
plt.plot(x_daily_weekly_long_sinu)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我的目标是将这个信号分成 3 个独立的隔离分量信号,其中包括:
期间如下图:
我尝试使用statsmodel中的STL分解方法:
sm.tsa.seasonal_decompose()
Run Code Online (Sandbox Code Playgroud)
但这仅适用于您事先知道周期的情况。并且仅适用于一次分解一个周期。同时,我需要分解任何具有多个周期性且其周期事先未知的信号。
谁能帮助如何实现这一目标?
我正在根据声学标签检测对河流中的鱼类深度进行建模(这意味着数据并不完全是完美间隔的连续时间序列)。我预测,深度会根据河流的空间位置而有所不同,因为不同的区域有不同的可用深度,一天中的不同时间,因为深度对光有反应,一年中的一天也有相同的原因,并且个体之间也有所不同。那么基本模型就是
深度 ~ s(lon, lat) + s(小时) + s(yday) + s(ID, bs="re")
有几百万次检测,所以模型很糟糕,所以
bam(深度 ~ s(经度、纬度) + s(小时) + s(yday) + s(ID, bs="re")
每个人的深度应该与之前的记录自相关(当然这取决于它最后一次注册的时间,但我不太知道如何解释时间上的离散间隔)。
我知道 rho 参数在 bam 中用作一种 corAR1 函数,我想这可以解释自相关。我还考虑将 lag(深度,by=ID) 作为预测变量,它的表现相当好,但我不确定这种方法的有效性。
我跟踪了几个面包屑发现 rho 可以从没有相关结构的模型中估计 rho<-acf(resid(m1),plot=FALSE)$acf 2 -
对于每个人,我添加了一个 ARSTART 变量来调用 AR.start = df$ARSTART 来考虑个体之间不同的时间序列 - 所以我的模型是
m2<-bam(depth~s(lon, lat)+s(yday)+s(hour, bs="cc")+s(fID, bs="re"), AR.start=df$ARSTART, discrete=T, rho=rho, data=df)
Run Code Online (Sandbox Code Playgroud)
一切都进展顺利,根据 AIC,具有自相关结构的模型拟合得更好(更好),但效果的后验估计非常不准确(或缩放比例很差)。与没有结构的模型相比,根据 lon、lat 平滑器的空间效应变得极端(且均匀),其中空间平滑器似乎非常有效地捕获空间方差,表明它们被预测在较深的区域中更深且在较浅的区域较浅。
如果需要,我可以提供示例代码,但问题本质上是,与模型相比,自相关结构会如此显着地改变后验估计的值是否有意义,并且时间自相关结构是否吸收了所有方差是否与空间效应相关(在具有自相关结构的模型中似乎被否定)?
一些想法-我不知道什么是最好的:
非常感谢所有帮助-非常感谢
我正在为时间序列数据向量执行自相关过程.我期待为给定的时间序列创建一个由自相关组成的对称矩阵.
我正在使用该acf()函数来检查我的值,它返回:
系列'acfData'的自相关,滞后
0 1 2 3 4 5 6 7 8 9 10 11 12 13
1.000 -0.038 0.253 0.266 0.250 0.267 -0.182 0.281 -0.013 -0.067 -0.122 -0.115 -0.023 -0.337
Run Code Online (Sandbox Code Playgroud)
为了实现矩阵,我然后对数据执行data.frame更改,以允许我按指定的滞后值滑动值:
dataF <- data.frame("data" = acfData)
names(dataF)[1] <- "acfData"
dataLag <- slide(dataF, "acfData", slideBy = -1)
Run Code Online (Sandbox Code Playgroud)
给:
> head(dataLag)
acfData acfData-1
1 -7 NA
2 5 -7
3 4 5
4 -17 4
5 6 -17
6 -10 6
Run Code Online (Sandbox Code Playgroud)
当我执行一个cor()函数时,这给出了正确的2x2矩阵:
> cor(na.omit(dataLag))
acfData acfData-1
acfData …Run Code Online (Sandbox Code Playgroud) 我有一个时间序列数据,我想显示自相关函数。(我们知道正弦函数的自相关是余弦函数)
我应用了几种方法来做到这一点如下
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
x = np.arange(0,30,0.1) #interval=0.1, 300 samples
y = np.sin(x)
y_cor = np.correlate(y,y,'full')
lags = np.arange(-x[-1],x[-1]+0.1,0.1)
#sin(x)
plt.figure()
plt.plot(x,y)
#autocorrelation(numpy)
plt.figure()
plt.plot(lags,y_cor)
plt.xlabel('Lag')
plt.ylabel('autocorrelation')
#matplotlib
plt.figure()
plt.acorr(y,maxlags=y.size-1)
#statsmodels
plt.figure()
plot_acf(y,lags=y.size-1)
plt.show()
Run Code Online (Sandbox Code Playgroud)
然而,结果是衰减余弦函数,而不是纯 cos(x)。我看到一些答案说这是因为计算自相关时包在 x 区域之外填充了零,但是如何解决这个问题以获得纯 cos(x) ?

我有一个现有的时间序列(1000 个样本),并使用 R 中的函数计算滚动平均值filter(),每个样本取 30 个样本的平均值。这样做的目标是创建时间序列的“平滑”版本。现在我想创建“看起来像”原始时间序列的人工数据,即有些噪音,如果我将相同的filter()函数应用于人工数据,这将导致相同的滚动平均值。简而言之,我想模拟一个具有相同总体过程但不与现有时间序列完全相同的值的时间序列。总体目标是研究某些方法是否可以检测时间序列之间趋势的相似性,即使趋势周围的波动不相同。
为了提供一些数据,我的时间序列看起来有点像这样:
set.seed(576)
ts <- arima.sim(model = list(order = c(1,0,0), ar = .9), n = 1000) + 900
# save in dataframe
df <- data.frame("ts" = ts)
# plot the data
plot(ts, type = "l")
Run Code Online (Sandbox Code Playgroud)
过滤函数产生滚动平均值:
my_filter <- function(x, n = 30){filter(x, rep(1 / n, n), sides = 2, circular = T)}
df$rolling_mean <- my_filter(df$ts)
lines(df$rolling_mean, col = "red")
Run Code Online (Sandbox Code Playgroud)
为了模拟数据,我尝试了以下方法:
df$sim1 <- df$rolling_mean + rnorm(1000, sd = sd(df$ts))
lines(df$sim1, col …Run Code Online (Sandbox Code Playgroud) 据我了解,GAMM 具有随机误差或空间自相关误差结构。
我正在尝试运行具有空间自相关误差结构的 GAMM 模型,例如 corExp(参见https://stat.ethz.ch/R-manual/R-devel/library/nlme/html/corClasses.html)。
但是我对从 GAM 建模 GAMM 感到困惑。
下面是我的 GAM(广义加性模型)代码。
library(mgcv)
mod.gam <- gam(Chave~s(Band_3) + s(Band_7) + s(Band_8) + s(BaCo_3_2) + s(BaCo_5_2) +
s(BaCo_5_3) + s(BaCo_5_4) + s(BaCo_8_2) + s(BaCo_8A_2),data = data)
summary(mod.gam)
fits = predict(mod.gam, newdata=data, type='response')
plot(data$Chave, fits, col='blue', ylab = "Predicted AGB KNN", xlab = "Estimated AGB")
plot(mod.gam)
Run Code Online (Sandbox Code Playgroud)
我如何将其更改为 GAMM?当我尝试使用 GAMM 时(如下所述),我没有看到太大的变化:
model <- gamm(Chave~s(Band_3) + s(Band_7) + s(Band_8) + s(BaCo_3_2) +
s(BaCo_5_2) + s(BaCo_5_3) + s(BaCo_5_4) + s(BaCo_8_2) + s(BaCo_8A_2),
data …Run Code Online (Sandbox Code Playgroud) I'm trying to understand acf and pacf. But do not understand why acf() results do not match simple cor() with lag1
I have simulated a time series
set.seed(100)
ar_sim <- arima.sim(list(order = c(1,0,0), ar = 0.4), n = 100)
ar_sim_t <- ar_sim[1:99]
ar_sim_t1 <- ar_sim[2:100]
cor(ar_sim_t, ar_sim_t1) ## 0.1438489
acf(ar_sim)[[1]][2] ## 0.1432205
Run Code Online (Sandbox Code Playgroud)
Could you please explain why the first lag correlation in acf() does not exactly match the manual cor() between the series and lag1?
python ×4
r ×4
correlation ×2
gam ×2
numpy ×2
spatial ×2
time-series ×2
arima ×1
dataframe ×1
fft ×1
mgcv ×1
pandas ×1
simulation ×1
smoothing ×1
statistics ×1