Рассчитать перекос и куртоз по годам в R - PullRequest
2 голосов
/ 21 октября 2019

У меня есть таблица, которая выглядит следующим образом:

start_table <- data.frame("Water_Year" =  c("1903", "1903", "1904", "1904"), "X" = c(13, 11, 12, 
15), "Day" = c(1, 2, 1, 2))

(столбец «День» не участвует в моем расчете перекоса и эксцесса, он просто находится в моей таблице)

Мне нужна таблица, которая рассчитывает значения асимметрии и эксцесса, сгруппированные по годам:

end_table <- data.frame("Water_Year" =  c("1903", "1904"), "Skew" = c("skew_number_here", 
"skew_number_here"), "Kurtosis" = c("kurtosis_number_here", "kurtosis_number_here"))

Я не могу понять, как сгруппировать их по годам для выполнения этих расчетов.

Ответы [ 3 ]

2 голосов
/ 21 октября 2019

Использование fBasics с data.table:

library(fBasics)
library(data.table)
setDT(start_table)[, .(Skew = skewness(X), Kurtosis=kurtosis(X)), .(Water_Year)][]
#>    Water_Year Skew Kurtosis
#> 1:       1903    0    -2.75
#> 2:       1904    0    -2.75
2 голосов
/ 21 октября 2019

Вы также можете определить функции асимметрии / эксцесса:

kurtosis <- function(x) {  
 m4 <- mean((x - mean(x))^4) 
 kurtosis <- m4/(sd(x)^4) - 3  
 kurtosis
}

skewness <-  function(x) {
 m3 <- mean((x - mean(x))^3)
 skewness <- m3/(sd(x)^3)
 skewness
}

Затем, чтобы применить его в base R:

aggregate(X ~ Water_Year, 
          FUN = function(x) c(kurtosis = kurtosis(x), skewness = skewness(x)),
          data = start_table)

  Water_Year X.kurtosis X.skewness
1       1903      -2.75       0.00
2       1904      -2.75       0.00
1 голос
/ 21 октября 2019

Опция group_by/summarise

library(dplyr)
library(moments)
start_table %>% 
   group_by(Water_Year) %>%
   summarise(Skew = skewness(X), Kurtosis = kurtosis(X))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...