Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: mikrom 12. 01. 2024, 18:46:42
-
Vazeni R-Gurus,
Potreboval som vytvoriť v R funkciu podobnú vstavanej acf() (= Auto Correlation Function).
Najprv som sa pozrel na zdroj build-in funkcie acf() pomocou prikazu
getAnywhere(plot.acf)
Potom som vytvoril svoju funkciu s názvom my_acf() s takmer rovnakou strukturou vysledkov, aku ma povodné acf(), t.j.:
> str(my_acf(x))
List of 6
$ acf : num [1:4, 1, 1] 1 0.25 -0.3 -0.45
$ type : chr "correlation"
$ n.used: int 4
$ lag : num [1:4, 1, 1] 0 1 2 3
$ series: chr "x"
$ snames: NULL
> str(acf(x))
List of 6
$ acf : num [1:4, 1, 1] 1 0.25 -0.3 -0.45
$ type : chr "correlation"
$ n.used: int 4
$ lag : num [1:4, 1, 1] 0 1 2 3
$ series: chr "x"
$ snames: NULL
- attr(*, "class")= chr "acf"
Ale nepodarilo sa mi to dobre.
Zatial co povodna funkcia acf() k tomuto vstupnemu vektoru
> x <- c(1, 2, 3, 4)
vrati takyto pekny vystup
> y <- acf(x)
> y
Autocorrelations of series ‘x’, by lag
0 1 2 3
1.00 0.25 -0.30 -0.45
tak moja funkcia my_acf() my vratila iba nieco taketo nepekne
> y <- my_acf(x)
> y
$acf
, , 1
[,1]
[1,] 1.00
[2,] 0.25
[3,] -0.30
[4,] -0.45
$type
[1] "correlation"
$n.used
[1] 4
$lag
, , 1
[,1]
[1,] 0
[2,] 1
[3,] 2
[4,] 3
$series
[1] "x"
$snames
NULL
Potom som si vsimol, ze vo vysledku mojej funkcie nemam atribut class="acf"
Pridal som ho a teraz je to uz OK:
> y <- my_acf(x)
> y
Autocorrelations of series ‘x’, by lag
0 1 2 3
1.00 0.25 -0.30 -0.45
> y <- acf(x)
> y
Autocorrelations of series ‘x’, by lag
0 1 2 3
1.00 0.25 -0.30 -0.45
Teraz sa vystup mojej funkcie my_acf() zhoduje s vystupom vstavanej funkcie acf().
Ale aj tak nechapem, ako R vie, ze ma urobit speciálny vystup pre triedu „acf“.
Vie mi niekto poradit kde a akym sposobom je to nakodovane ?
-
Kto by ste mi chceli pomoct a nemuseli vymyslat a improvizovat, tak prikladam zdrojaky co som skusal ja:
acf() bez class atributu
# How to compute acf ?
# see the book:
# Paul S.P. Cowpertwait · Andrew V. Metcalfe:
# Introductory Time Series with R
# pp 33
my_acvf <- function(x, k) {
# acvf() - autocovariance estimation
s = 0
for (t in 1:(length(x) - k)) {
s <- s + (x[t] - mean(x))*(x[t+k] - mean((x)))
}
return(s / (length(x) - 1))
}
my_acfk <- function(x, k) {
# acf() - autocorrelation estimation for given k
return (my_acvf(x, k) / my_acvf(x, 0))
}
my_acf <- function(x) {
# acf() - autocorrelation estimation returns the 3D-array
series <- deparse1(substitute(x))
x <- as.matrix(x)
my_acf_vector <- vector()
my_lag_vector <- seq(from = 0, along = x)
for (k in my_lag_vector) {
my_acf_vector <- c(my_acf_vector, my_acfk(x, k))
}
my_lag_array <- array(my_lag_vector, dim = c(length(my_lag_vector), 1, 1))
my_acf_array <- array(my_acf_vector, dim = c(length(my_acf_vector), 1, 1))
type <- "correlation"
sampleT <- as.integer(nrow(x))
my_acf_out <-
structure(
list(acf = my_acf_array, type = type, n.used = sampleT,
lag = my_lag_array, series = series, snames = colnames(x)))
return (my_acf_out)
}
acf() s class atributom
# How to compute acf ?
# see the book:
# Paul S.P. Cowpertwait · Andrew V. Metcalfe:
# Introductory Time Series with R
# pp 33
my_acvf <- function(x, k) {
# acvf() - autocovariance estimation
s = 0
for (t in 1:(length(x) - k)) {
s <- s + (x[t] - mean(x))*(x[t+k] - mean((x)))
}
return(s / (length(x) - 1))
}
my_acfk <- function(x, k) {
# acf() - autocorrelation estimation for given k
return (my_acvf(x, k) / my_acvf(x, 0))
}
my_acf <- function(x) {
# acf() - autocorrelation estimation returns the 3D-array
series <- deparse1(substitute(x))
x <- as.matrix(x)
my_acf_vector <- vector()
my_lag_vector <- seq(from = 0, along = x)
for (k in my_lag_vector) {
my_acf_vector <- c(my_acf_vector, my_acfk(x, k))
}
my_lag_array <- array(my_lag_vector, dim = c(length(my_lag_vector), 1, 1))
my_acf_array <- array(my_acf_vector, dim = c(length(my_acf_vector), 1, 1))
type <- "correlation"
sampleT <- as.integer(nrow(x))
my_acf_out <-
structure(
list(acf = my_acf_array, type = type, n.used = sampleT,
lag = my_lag_array, series = series, snames = colnames(x)),
class = "acf")
return (my_acf_out)
}
-
setting parent class?
co treba R coercion.
-
Myslim, ze toto je to co som na uvod potreboval vediet
> methods(class = "acf")
[1] [ plot print
see '?methods' for accessing help and source code
> m <- methods(class = "acf")
> attr(m, "info")
> getS3method("plot", class = "acf")
> getS3method("print", class = "acf")
-
... nechapem, ako R vie, ze ma urobit speciálny vystup pre triedu „acf“.
ak by podobnu otazku niekto musel riesit, tak odpoved je prekvapivo jednoducha a tento clanok to dobre vysvetluje: https://www.datamentor.io/r-programming/s3-class
Podla neho som si vytvoril triedu pre vlastnu acf() a k nej metody print() a plot()