'skewness' and 'kurtosis' in 'timeDate' package
stelope
stelope at jcom.home.ne.jp
Mon Jan 24 13:12:29 CET 2011
Dear Maintainer, Rmetrics Core Team
Today, I found that tow functions ('skewness' and 'kurtosis' in
'timeDate' package) output wrong result when we use 'method="fisher"'.
The reason why these functions do not calculate correct value is that,
in each function, data used are raw data, not scaled data (or mean
difference data).
in skewness
if (method == "fisher") {
if (n < 3)
skewness = NA
else skewness = ((sqrt(n * (n - 1))/(n - 2)) *
(sum(x^3)/n))/((sum(x^2)/n)^(3/2))
}
in kurtosis
if (method == "fisher") {
kurtosis = ((n + 1) * (n - 1) * ((sum(x^4)/n)/(sum(x^2)/n)^2 -
(3 * (n - 1))/(n + 1)))/((n - 2) * (n - 3))
}
These 'x' must be scaled, or at least, subtracted by 'mean(x)'.
As you know, skewness or kurtosis must be same for 'x' and 'x+constant',
ie.,
skewness(x) == skewness(x+constant), kurtosis(x) == kurtosis(x+constant).
For example, in both function, if we use 'method="moment"', R calculate
as follows;
> set.seed(123)
> old <- options(digits=20)
> x <- rnorm(20)
> # correct, if ue use method="moment"(default)
> cat(skewness(x, method="moment"), skewness(x+10, method="moment"))
-0.06249520603709942 -0.0624952060370983
> cat(kurtosis(x, method="moment"), kurtosis(x+10, method="moment"))
2.452109269820757 2.452109269820757
> # wrong, if we use method="fisher"
> cat(skewness(x, method="fisher"), skewness(x+10, method="fisher"))
0.4023203841762693 1.096898941351229
> cat(kurtosis(x, method="fisher"), kurtosis(x+10, method="fisher"))
-0.03206259158039006 -2.190617806139012
> options(old)
If we use 'method="fisher"' for scaled data, R outputs correct results
as follows;
> # correct again, if we use method="fisher" and scaled data
> cat(skewness(scale(x), method="fisher"), skewness(scale(x+10),
method="fisher"))
-0.0730938082305255 -0.0730938082305243
> cat(kurtosis(scale(x), method="fisher"), kurtosis(scale(x+10),
method="fisher"))
0.003563444529474211 0.003563444529473632
As the 'x' argument of each function described as 'a numeric vector or
object', the program must be as follows.
timeDate:::skewness.default
function (x, na.rm = FALSE, method = c("moment", "fisher"), ...)
{
:
if (method == "fisher") {
if (n < 3)
skewness = NA
else {
x <- scale(x) # This must be added.
skewness = ((sqrt(n * (n - 1))/(n - 2)) * (sum(x^3)/n))/((sum(x^2)/n)^(3/2))
}
}
:
}
timeDate:::kurtosis.default
function (x, na.rm = FALSE, method = c("excess", "moment", "fisher"),
...)
{
:
if (method == "fisher") {
x <- scale(x) # This must be added.
kurtosis = ((n + 1) * (n - 1) * ((sum(x^4)/n)/(sum(x^2)/n)^2 -
(3 * (n - 1))/(n + 1)))/((n - 2) * (n - 3))
}
:
}
More information about the Rmetrics-core
mailing list