R:“结束”后的窗口功能“开始”

时间:2015-04-16 03:54:45

标签: r

我遇到R中的窗口功能问题。

newdata1 <-window(mergedall,start=c(as.Date(as.character("2014-06-16"))),end=c(as.Date(as.character("2015-01-31"))))

我收到了这个错误。我试图了解如何解决这个问题。谢谢!

Error in window.default(mergedall, start = c(as.Date(as.character("2014-06-16"))),  : 
  'start' cannot be after 'end'
In addition: Warning message:
In window.default(mergedall, start = c(as.Date(as.character("2014-06-16"))),  :
  'end' value not changed`

5 个答案:

答案 0 :(得分:1)

我知道这是一个旧帖子。但是,请确保“ mergedall”是使用ts命令创建的时间序列对象。

从任何向量或序列创建时间序列对象时,

some_result_ts <- ts(vector,frequency=xx,start=c(yyyy,m))

当yyyy小于您在window命令中指定的开始时,会出现这种错误。

例如,如果您采用数据框列,向量或序列,并且在使用ts命令进行ts形成过程中,以12的频率给出yyyy = 2010,m = 1并假定它是36个月的数据,结束日期是2013,12。

some_result_ts <- ts(vector,frequency=12,start=c(2010,1))

然后,在使用窗口函数时,如果您指定start = c(2014,1),则R将给出一条消息,即=>'start'不能在'end'之后且结束值不变

答案 1 :(得分:1)

同样,这是一个旧帖子。但是由于我通过搜索相同的错误偶然发现了它。我仍然想为将来的Google员工提供一些有用的信息。

我无法复制您的问题,因为您没有提供自己的 mergedall 数据集。因此,我从一个玩具示例开始,以显示可能出现问题的几个位置。真的没有那么困难。

潜在问题#1:

您最初没有创建ts对象。窗口函数在ts对象上运行,它不能只是直接从df获取的向量。首先使用ts函数使向量成为ts对象。然后为它分配适当的开始,结束,频率。

all <-seq(1:8) #eight observations in sequence

将这八个值指定为从201406到201501的每月观测值。频率12表示每月。

all.ts <- ts(all, start = c(2014,6), end = c(2015,1), frequency = 12)

潜在问题2:

您可能已经将您的mergedall系列分配为ts对象,但是具有不同的开始/结束/频率。我上面的例子是基于每月的观察。因此,即使它们是正确的示例,也不会与您日常使用的窗口功能匹配。窗口函数和ts对象必须保持一致。

在我的示例之后,窗口函数将如下所示:

newdata1 <-window(all.ts,start=c(2014,6),end=c(2015,1) )

答案 2 :(得分:0)

嗨,这是你可以尝试的,也许这就是解决方案,因为我也遇到了同样的问题。

您可能没有在时间序列对象中引用正确的索引值。

在下面的代码中,我添加了索引(i),如果对象只有一个系列或任何数字,或者使用简单的循环传递不同的值,则可以放置1。 希望它有所帮助。!

newdata1 <-window(mergedall[i],start=c(as.Date(as.character("2014-06-16"))),end=c(as.Date(as.character("2015-01-31"))))

答案 3 :(得分:0)

我也是未来的 googler,但没有一个答案对我有帮助。这是我的问题和解决方案:

MWE 问题:

set.seed(50)
data <- ts(rnorm(100), start(1850))
data.train <- window(data, start = 1850, end = 1949)

MWE 解决方案:

set.seed(50)
data <- ts(rnorm(100), start = (1850))
data.train <- window(data, start = 1850, end = 1949)

问题是设置开始日期时缺少等号。 结果变量 data 仍然是一个时间序列;但赠品是:“从 1 到 100 的时间序列”而不是“从 1850 到 1949 的时间序列”,这告诉我某些在创建时间序列时出错了。 >

根据 ts 文档,start() 函数不会将此作为错误引发,大概是因为它接受来自 {stats} 包的 ?ts 函数。< /p>

答案 4 :(得分:-2)

这可能是因为您的&#39; mergedall&#39;的格式引起的问题。宾语。 确保您有ts,xts或zoo对象。 尝试f.ex.以下是第一个,以确保对象的格式:

str(mergedall)
相关问题