【问题标题】:Row wise normality, skewness and kurtosis in one command一个命令中的逐行正态性、偏度和峰度
【发布时间】:2021-09-16 04:39:54
【问题描述】:

我的数据是:

X0 X1 X2 X3 category
0  15 4  4  TAH
0  2  5  0  MAT
0  11 9  0  BIO

我想逐行计算正态性、偏度和峰度。主要原因是我在不同的行中有类别(在专用列中)。有没有可以实现这个功能的函数?

我一直在尝试使用moments 包和dplyr 包来做到这一点,类似于这篇文章: Function that calculates, mean, variance and skewness at the same time in a dataframe。 但他们的解决方案是按列而不是按行。

df3 %>%
  gather(category, Val) %>% 
  group_by(category) %>% 
  summarise(Mean = mean(Val), 
            Vari = var(Val), 
            Skew = skewness(Val))

为了正常,我对每一行分别尝试了以下命令:

shapiro.test(df3[1,])

对此的任何帮助将不胜感激。

【问题讨论】:

  • 注意: 更好地使用e1071 包(v1.7.8)的skewness 函数,它比moments 包(v0.14)更好地建立.
  • 感谢您的建议。我想知道为什么使用这两个包的结果如此不同:e1071 和moments
  • 试试type=1。比较:identical(e1071::skewness(unlist(d[3, -5]), type=1), moments::skewness(unlist(d[3, -5])))。阅读?e1071::skewness 以决定您要使用哪种类型。

标签: r distribution skew rowwise


【解决方案1】:

你可以使用rowwise -

library(dplyr)
library(tidyr)

df %>%
  rowwise() %>%
  mutate(Mean = mean(c_across(X0:X3)), 
         Vari = var(c_across(X0:X3)),
         Shap = shapiro.test(c_across(X0:X3))$p.value,
         Skew = moments::skewness(c_across(X0:X3))) %>%
  ungroup

#     X0    X1    X2    X3 category  Mean    Vari   Shap   Skew
#  <int> <int> <int> <int> <chr>    <dbl>   <dbl>   <dbl>  <dbl>
#1     0    15     4     4 TAH       5.75   41.583  0.232  0.84778 
#2     0     2     5     0 MAT       1.75   5.5833  0.220  0.68925 
#3     0    11     9     0 BIO       5      34      0.110  0.058244

与您的尝试类似,您可以获取长格式数据并计算每个 category 的统计信息(按行)。

df %>%
  pivot_longer(cols = -category) %>%
  group_by(category) %>%
  summarise(Mean = mean(value), 
            Vari = var(value), 
            Skew = moments::skewness(value))

【讨论】:

  • 感谢您的解决方案。我们还可以在上面的代码中包含某种正态性测试吗?喜欢shapiro.test()
  • 当然,您可以使用shapiro = list(shapiro.test(c_across(X0:X3)))) 保存测试或使用shapiro = shapiro.test(c_across(X0:X3))$p.value 仅提取p 值。
【解决方案2】:

你可以试试

library(PerformanceAnalytics)

df %>%
  select(category, X0:X3) %>%
  t %>%
  as.data.frame %>%
  row_to_names(row_number = 1) %>%
  mutate(TAH = as.numeric(TAH),
         MAT = as.numeric(MAT),
         BIO = as.numeric(BIO)) %>%
  sapply(., function(x) list(mean = mean(x), var = var(x), skew = skewness(x), kur = kurtosis(x)))

     TAH        MAT       BIO       
mean 5.75       1.75      5         
var  41.58333   5.583333  34        
skew 0.8477758  0.6892545 0.05824397
kur  -0.8325348 -1.141902 -1.922722

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 2020-04-16
    • 2018-05-27
    • 2019-04-01
    • 2023-03-06
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多