同时对 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)
现在我们只用split
和lapply
:
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
您需要阅读 split
、lapply
以及如何使用 lists
,但它们旨在解决您正在处理的问题类型。
我已经为 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)
现在我们只用split
和lapply
:
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
您需要阅读 split
、lapply
以及如何使用 lists
,但它们旨在解决您正在处理的问题类型。