同时对 R 中的所有变量(包括子集)执行正态性检验(Lilliefors)

Perform normality test (Lilliefors) simultaneously on all variables (including subsetted) in R

我已经为 Lilliefors 测试安装了 nortest 包,但是由于 lillie.test(x) 一次只允许我测试一个变量,我将不得不手动执行 100 次这样的操作,因为我的数据集有许多子组和变量。

是否有通用代码可以在 R 上应用于 运行 此测试,同时对所有个体 variables/subgroups(例如 maindata$variable1, subset1$variable1, subset2$variable1, subset2$variable2, subset3$variable1, subset3$variable2 等)生成列表?

提前致谢:)


编辑 - 示例数据集

      EyeColour      HairColour     Weight       Height    Gender
1          Brown        Black          1.4         0.2      M
2          Brown        Blond          1.4         0.2      F
3          Blue         Black          1.3         0.2      M
4          Brown        Blond          1.5         0.2      F
5          Blue         Black          1.4         0.2      M
6          Blue         Blond          1.7         0.4      F
900        ...          ...             ...          ...    ...

基本上,如果我想通过 Lilliefors 评估 BrownEyes+BlackHair、BlueEyes+BlackHair 以及 BrownEyes+BlackHair+Male、BrownEyes+BlackHair+Female 等身高的正常性...

我可以手动执行此操作,但我有大约 40 个数字变量,想知道是否有比手动执行每个变量更简单的方法。

我打算为所有这些变量组合生成 lillie.test(x) 的自动重复,并得到如下内容:

 HEIGHT                          P-VALUE
BlueEyes+BlackHair              0.11212
BlueEyes+BlackHair              0.40001
BrownEyes+BlackHair+Male         0.532
BrownEyes+BlackHair+Female       0.7674

当您提供可重现的数据时,回复会更容易。编一些也不难:

set.seed(42)
EyeColour <- sample(c("Blue", "Brown", "Green"), 500, replace=TRUE)
HairColour <- sample(c("Black", "Blond", "Red"), 500, replace=TRUE)
Weight <- rnorm(500, 1.5, .15)
Height <- rnorm(500, .3, .05)
Gender <- sample(c("F", "M"), 500, replace=TRUE)
dfm <- data.frame(EyeColour, HairColour, Weight, Height, Gender)

现在我们只用splitlapply:

dfm.split <-split(dfm, dfm[, c("EyeColour", "HairColour", "Gender")])
library(nortest)
wgt.norm <- lapply(dfm.split, function(x) lillie.test(x$Weight))
hgt.norm <- lapply(dfm.split, function(x) lillie.test(x$Height))

结果以所有组合的列表形式返回。如果某些组的观察值少于 5 个(测试所需的最小值),事情会稍微复杂一些:

wgt.norm[1]
# $Blue.Black.F
# 
#   Lilliefors (Kolmogorov-Smirnov) normality test
# 
# data:  x$Weight
# D = 0.11064, p-value = 0.4328
hgt.norm[1]
# $Blue.Black.F
# 
#   Lilliefors (Kolmogorov-Smirnov) normality test
# 
# data:  x$Height
# D = 0.11593, p-value = 0.3586

您需要阅读 splitlapply 以及如何使用 lists,但它们旨在解决您正在处理的问题类型。