我有两个向量,x
和y
。
x
是一个向量,其中每个条目代表一个月的一个月,所以我(比如说)有10年的数据,然后是length(x) = 120
,依此类推。
(我使用了“posix.ct”命令,因此在这个意义上它们确实是“月”,但我不能只将x
作为c(1:n)
之类的数字向量,因为我已经知道c(1:n)
的某个元素对应于哪个月和哪一年?即x = c(1:n)
,我知道x[13]
是第二年的2月,依此类推......)
y是一个向量,其中每个元素是某个月的特定变量的观察值。 所以观察到的数据分组如下(1月,1。023),(2月,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
替换为x1
,则ksmooth$y
除了第一个和最后一个之外的所有值都是NA,它们与输入y
的值相等。
所以我尝试了一些带宽:
h = 0.1
:现在smooth$y = y
,和以前一样。生成一个垂直条(它与我在lines()
命令中指定的颜色相同,因此它必须与ksmooth
命令有关。)
h = 10
:为平滑的$ y获得一些非奇怪的结果,但是,会像以前一样生成垂直条。
然后,我尝试了非常大的带宽的疯狂想法;
h = 1e+06
:当我在上面的代码中使用x1
和x2
时,这没有产生任何结果。当我将x2
更改为x1
时,我得到了一些好结果。对于h = 1e+09
(这是巨大的!)我得到了一个非常好的结果。 (我得到一条适合数据的曲线,看起来不错)
但是h = 1e+09
,这是合理的吗?在我看过的所有例子中,h是0.1到10之间的东西,给予或接受。听说过一些经验法则:h应该等于n ^( - 1/5),其中n是数据点的数量。
答案 0 :(得分:3)
我认为你缺少的一件事是当你没有指定任何东西时R 没有找到一个合适的平滑参数,它只是使用0.5的带宽,这是完全没用的在你的情况下。
您可能遗漏的另一件事是,在ksmooth
中,bandwidth
参数是x
。如果ksmooth
的{{1}}值为x
,则会将其转换为数字,即秒的数量。因此,您的带宽将在几秒钟内测量,这是一个不良结果。如果Date
的月份值为ksmooth
,则默认为0.5个月的带宽,这也是不可取的。
您要做的是为您正在使用的x
指定合理的带宽。这是一个例子:
x