'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