1

R の KDE 関数はどのように実装されているのだろうか。

dates5.csv は次のとおりです。

  day
2013-01-02
2013-03-01

つまり、2 つの日付です。ここで、データを読み込み、if から四角形の KDE を計算し、以下のプロットを取得します。

  data <- read.csv("dates5.csv", header=T)
  days <- data$day

  daysPosix <- as.POSIXct(days, tz="Europe/Zurich")

# compute density
  ds <- density(as.numeric(daysPosix), 
                bw = 3600 * 24 * 7,
                kernel = "rectangular",
                cut = 3)
  plot(ds, xaxt ="n", xlab="", ylab="",  ylim = c(0,max(ds$y)),
         main = "Temporal density (uniform kernel,
                     bandwidth = 7 days)")

    points(x = as.numeric(daysPosix),
           y=rep(0, length(daysPosix)),
           pch="|",
           col="#00000080")
    times.seq <- seq(daysPosix[1],
                     daysPosix[length(daysPosix)],
                     by = "weeks")
    labels = strftime(times.seq, "%d.%m.%y")
    axis(1,times.seq,labels)

ここに画像の説明を入力

x 軸の目盛りは週単位で区切られています。一見すると、このプロットは理にかなっています。2 つの点の上に 2 つの長方形が構築されています。それでも、私が理解できないことが 2 つあります:各「形状」のおおよその範囲が 3 週間よりも少し長く、予想どおりの 7 日間ではないのはなぜですか (これは帯域幅なので?)? そして、形の両側には急な「崖」があるのに、垂直にはならないのはなぜですか?

4

1 に答える 1

3

?density次のことに注意してください。

bw使用する平滑化帯域幅。カーネルは、これがスムージング カーネルの標準偏差になるようにスケーリングされます。

そのbw = 3600*24*7/sqrt(12)ため、1週間幅の形状が得られるようです。言い換えれば、帯域幅を「スケール解除」する必要があるため、スケールされたときにdensity必要なものが得られます。を設定することもできますadjust = 1/sqrt(12)

形状に垂直ドロップオフを持たせるには、値を増やしnて計算解像度を向上させn = 2^15ます。

したがって、density呼び出しを次のように変更します。

  ds <- density(as.numeric(daysPosix), 
                bw = 3600 * 24 * 7 / sqrt(12),
                kernel = "rectangular",
                cut = 3, n=2^15)

形状の幅を確認します。

which(abs(diff(ds$y))>max(ds$y)/2) # approximate locations of the edges
[1]  1197  4469 28299 31571
(ds$x[4469]-ds$x[1197])/(3600*24*7)
[1] 1.00034
于 2013-05-29T14:28:45.730 に答える