我已经为Lilliefors测试安装了nortest软件包,但是由于lillie.test(x)
只允许我一次测试一个变量,因此我必须手动执行100个测试,因为我的数据集包含许多子组和变量。
是否可以在R上应用通用代码,以同时在所有单个变量/子组(例如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
,但是它们是为解决您正在解决的问题而设计的。