R 自相关函数(ACF)中出错:对象中缺少值

R 自相关函数(ACF)中出错:对象中缺少值,r,time-series,autocorrelation,R,Time Series,Autocorrelation,我正在处理一个时间序列数据,其结构如下: str(tseries) Time-Series [1:479] from 1979 to 2019: 0.0258 0.0234 0.0055 0.0302 0.0305 0.0232 0.025 0.0234 0.0074 0.0089 ... 我试图进行时间序列分析,因此使用自相关函数(ACF)。首先,它能够在运行时返回绘图: acf(tseries) 但是,当我尝试执行区分和记录的acf()函数时,它给了我一个错误: > acf(di

我正在处理一个时间序列数据,其结构如下:

str(tseries)
 Time-Series [1:479] from 1979 to 2019: 0.0258 0.0234 0.0055 0.0302 0.0305 0.0232 0.025 0.0234 0.0074 0.0089 ...
我试图进行时间序列分析,因此使用自相关函数(ACF)。首先,它能够在运行时返回绘图:

acf(tseries)
但是,当我尝试执行区分和记录的acf()函数时,它给了我一个错误:

> acf(diff(log(tseries)))
Error in na.fail.default(as.ts(x)) : missing values in object
In addition: Warning message:
In log(tseries) : NaNs produced

它所指的缺失值是什么?因为我已经确保我正在处理的数据集没有任何缺失值,如果这就是它的意思。

如果您的时间序列有任何负值,log将导致
NaN
,这将导致您的缺失值错误

> a <- c(-1,2,3,4,5,6)
> acf(diff(log(a)))
Error in na.fail.default(as.ts(x)) : missing values in object
In addition: Warning message:
In log(a) : NaNs produced
>一个acf(diff(log(a)))
na.fail.default(as.ts(x))中出错:对象中缺少值
此外:警告信息:
在日志(a)中:产生了NAN

正如Corey所回答的,问题是从负值中提取日志。 我想在他的回答中添加一条评论,解释更多关于如何解决您的问题的内容,但我的解释太长了

添加一个常数可以解决您的问题,但这取决于实际数字是否合理/是否有效。
通常,ARIMA和自相关意味着您测量的任何值都依赖于以前的值。例如,如果我想预测明天的温度,我看一下今天的温度:2是相关的。
这就是自相关测试的含义:查看序列中的某个值是否与同一序列中相近的其他值相关

在某些情况下,这种效应更具乘性,从1000增加到1100比从1增加到101更有可能。如果它是完全乘法的,那么从1000增加到1100的可能性与从1增加到1.1的可能性一样
在这些情况下,取对数是有意义的,对数的差异表示百分比增加或减少。这意味着日志无法处理符号中的切换:不能通过乘以或除以任何正数从1变为-1

这也可能取决于实际值的含义。任何人都会明白,温度从1ºC升高到2ºC与从33.8ºF升高到35.6ºF一样有意义,尽管第一个温度升高了100%,第二个温度升高了5%。这意味着用摄氏度或华氏度来记录温度是毫无意义的,尽管有时用开尔文或兰金来记录温度是有意义的

实际上,大多数问题都是线性和乘法效应的混合,从1000增加到1100与从1增加到2或类似的情况一样可能。 所以这取决于你的数据代表什么,你需要找到一些自相关最强的计算。事实上,在
a
中添加一些常量并记录日志的建议非常有效

对于选择哪个常数的问题,您需要自己回答:“哪些增加与其他增加一样可能?”
在我的例子中,说从1000增加到1100与从1增加到2的可能性一样,意味着求解方程
(1000+c)/(1100+c)==(1+c)/(2+c)
,其中
c
是我们要寻找的常数。这里的结果是9.09,尽管自相关函数对微小差异不敏感


你也可以玩一下,或者试试其他的功能。自相关越强,你的拟合越好。

那么,我应该如何处理负数呢?我不能恰当地回答这个问题,因为我不知道时间序列的起源。如果您有负值,那么您不能取对数,因为它没有定义(请尝试在R中执行
log(-1)
,以查看自己的证明)。如果你想让它工作,你可以先取绝对值,然后取对数,但这会改变时间序列。我不知道这是否有帮助,但我可以用diff和log函数绘制折线图,当你绘制时,你应该会得到错误
警告消息:在log(a)中:NaNs生成
。它仍在打印,因为它正在打印除负值以外的所有点。因此,图仍然可以显示。解决方案是不使用
log
,因为它不能处理负值,或者更改负值/删除它们,以便可以使用
log
。例如,您可以生成一个布尔值,指示某个值是否为负值,然后是绝对值,然后取对数,如果值以前为负值,则取反。@Corey Levinson否定对数与否定输入完全不同。如果我理解正确的话,你会想把-10转换成-2.3,比如log(10)=2.3,对吗?但同时,log(.1)也会给出-2.3,你计算出的方程是否适用于任何其他数字?是的,它只是回答了一个问题:哪两个比率的可能性相等?