2

我有两个向量,xy

x是一个向量,其中每个条目代表几年的一个月,所以我有(比方说)10 年的数据,length(x) = 120依此类推。(我使用了“posix.ct”命令,所以从这个意义上说它们确实是“月”,但我不能只x使用数字向量之类的c(1:n)东西,因为我已经知道哪个月和哪个年的某个元素c(1:n)对应于?即如果x = c(1:n),我知道那x[13]是第二年的二月,依此类推..)

y 是一个向量,其中每个元素都是在某个月份对特定变量的观察。所以观察到的数据是这样分组的(一月,0.123),(二月,2.125)等等。这几个月我有两个向量;

x1 = seq(as.POSIXct("YYYY-MM-DD", tz="GMT"),
       as.POSIXct("YYYY-MM-DD", tz="GMT"),
       by="month")
x2 = c(1:length(x1)) 

我想要做的是运行 ksmooth:

plot(x1,y)
smooth = ksmooth(x2,y,"normal")     
lines(smooth)

我在 plot() 命令中使用 x1 的原因是我不知道如何及时获取 x 轴。

当我没有指定任何东西时,R 应该会自动找到一个合适的平滑参数。结果是 ksmooth$y 等于输入向量 y!此外,图中还会生成一个垂直条。如果我在上面的代码中替换x2为NA,则除第一个和最后一个之外的所有值都是 NA,它们等于 input 的值。 x1ksmooth$yy

所以我尝试了一些带宽 h = 0.1::现在smooth$y = y,和以前一样。产生一个垂直条(它与我在命令中指定的颜色相同lines(),因此它必须与ksmooth命令有关。) h = 10:得到一些不奇怪的结果 smooth$y,然而,一个垂直条像以前一样产生.

然后,我尝试了超大带宽的疯狂想法; h = 1e+06:这在我使用时没有产生任何结果x1x2就像上面的代码一样。但是,当我更改x2为时x1,我得到了一些不错的结果。因为h = 1e+09(那是巨大的!!)我得到了一个非常好的结果。(我得到一条适合数据并且看起来不错的曲线)但是h = 1e+09,这合理吗?在我看过的所有示例中,h 是介于 0.1 和 10 之间的东西,给予或接受。听说过一些经验法则: h 应该等于 n^(-1/5) 其中 n 是数据点的数量。

4

1 回答 1

3

我认为您缺少的一件事是,当您没有指定任何内容时,R找不到合适的平滑参数,它只使用 0.5 的带宽,这在您的情况下完全没用。

您可能缺少的另一件事是ksmooth参数bandwidth中的x. 当ksmooth取值xDate,它将其转换为数字,即秒数。因此,您的带宽将以秒为单位进行测量,这是一个不受欢迎的结果。当ksmooth取值x为months时,它将默认为0.5个月的带宽,这也是不可取的。

您要做的是为x您正在使用的带宽指定一个合理的带宽。这是一个例子:

x1 = seq(as.POSIXct("2000-01-01", tz="GMT"),
       as.POSIXct("2010-12-31", tz="GMT"),
       by="month")
x2 = c(1:length(x1)) 
set.seed(1)
y = runif(length(x1))

plot(x1,y,type='l')
smooth = ksmooth(x2,y,"normal")     
lines(x1,smooth$y,col='blue',lwd=2)
lines(x1,ksmooth(x2,y,'normal',bandwidth=2)$y,col='red',lwd=2)
lines(x1,ksmooth(x2,y,'normal',bandwidth=10)$y,col='green',lwd=2)
lines(x1,ksmooth(x2,y,'normal',bandwidth=20)$y,col='orange',lwd=2)

平滑随机时间序列

于 2012-10-13T18:22:31.197 回答