Цикл для теста нормальности Шапиро-Вилка для нескольких переменных в R - PullRequest
2 голосов
/ 06 октября 2019

У меня есть набор данных с именем "My_data" и три переменные с именем a, b, c. Заголовок моих данных выглядит следующим образом:

> head(My_data)
  variable_A variable_B     value
1  Jul       W1 18.780294
2  Jul       W2 13.932397
3  Aug       W2 20.877093
4  Sep       W3  9.291295
5  May       W1 10.939570
6  Oct       W1 12.23671

Я хочу провести тест нормальности Шапиро для каждого подмножества с двумя переменными.

> Subset1=subset(My_data, variable_A== "Jan" & variable == "W1")
> Subset2=subset(My_data, variable_A== "Feb" & variable == "W1")
> Subset3=subset(My_data, variable_A== "Mar" & variable == "W1")
.
.
> Subset_n=subset(My_data, variable_A== "Jan" & variable == "W2")
> 

Subset_n2 = subset (My_data, variable_A =="Jan" & variable == "W3")

Вы видите, что мне нужно сделать множество подмножеств и сделать Shapiro для каждого.

Но если я смогу это сделать, это облегчит мою работу.

У меня есть этот код для блокировки

> loop_Shapiro = list()
> for (ids in unique(My_data$variable_A)){
+   My_sub = subset(x=My_data, subset=variable_A==ids)
+   
+   loop_Shapiro[[ids]] = shapiro.test(My_sub$value)
+ }

Этот цикл работает, но проблема в том, что он основан только на субаренде с одной переменной, а я хочу на две.

1 Ответ

1 голос
/ 06 октября 2019

Во-первых, давайте создадим примерный фрейм данных.

# Create example data frame
set.seed(18800)

My_data <- data.frame(
  variable_A = rep(month.abb, each = 30),
  variable_B = rep(paste0("W", 1:3), times = 120),
  value = rnorm(360)
)

Мы можем разделить фрейм данных с помощью split без использования subset. Результатом является список.

# Split the data frame
My_list <- split(My_data, f = list(My_data$variable_A, My_data$variable_B))

После этого мы можем использовать for-loop следующим образом.

loop_Shapiro <- list()

for (name in names(My_list)){
  My_sub <- My_list[[name]]
  loop_Shapiro[[name]] <- shapiro.test(My_sub$value)
}

# Check the results of the first shapiro test
loop_Shapiro[1]
# $Apr.W1
# 
# Shapiro-Wilk normality test
# 
# data:  My_sub$value
# W = 0.89219, p-value = 0.1794

Мы также можем рассмотреть возможность использования функции lapply после разделения. Результатом является список.

# Use lapply
loop_Shapiro2 <- lapply(My_list, function(x) shapiro.test(x$value))

loop_Shapiro2[1]
# $Apr.W1
# 
# Shapiro-Wilk normality test
# 
# data:  x$value
# W = 0.89219, p-value = 0.1794
...