Выполнить тест нормальности (Lilliefors) одновременно по всем переменным (включая подмножество) в R - PullRequest
1 голос
/ 19 января 2020

Я установил самый тестовый пакет для теста Lilliefors, но так как lillie.test(x) позволяет мне проверять только одну переменную за раз, мне придется вручную делать 100 с этим, поскольку в моем наборе данных есть много подгрупп и переменных. .

Существует ли общий код c, который я могу применить к R, чтобы запустить этот тест одновременно для всех отдельных переменных / подгрупп (например, maindata$variable1, subset1$variable1, subset2$variable1, subset2$variable2, subset3$variable1, subset3$variable2, et c) и создать список?

Заранее спасибо:)


EDIT - образец набора данных

      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, et c ...

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

То, что я собираюсь сгенерировать, это автоматические повторы lillie.test(x) для всех этих комбинаций переменных и получить что-то вроде этого:

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

1 Ответ

1 голос
/ 20 января 2020

Отвечать легче, когда вы предоставляете воспроизводимые данные. Нетрудно придумать:

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, но они предназначены для решения проблемы, над которой вы работаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...