R: Итерация по переменной

У меня есть следующий набор данных1:

Height | Group
1,556  |  A
2,111  |  B
1,556  |  A
2,341  |  B
1,256  |  A
2,411  |  B

Я хотел бы вычислить критерий нормальности Шапиро-Уилка для высоты по переменной Group

myvar <- c("Height")

res<- vector("list", length(myvars))

a <- factor(dataset1$Group)
myfactor <- levels(a)

i=1
for (myfactor in dataset1) {
    res[[i]] <- shapiro.test(dataset1$Size)
    i=i+1
}

res - возвращает n групп тестов, но все с одинаковым p-значением и W. Может ли кто-нибудь помочь мне понять, что не так?


person Mauro Braganca    schedule 05.04.2011    source источник


Ответы (3)


Легче написать новый код, чем найти все ошибки в своем коде.

lapply(split(dataset1$Height,dataset1$Group),shapiro.test)

$`  A`

        Shapiro-Wilk normality test

data:  X[[1L]] 
W = 0.75, p-value = 3.031e-08


$`  B`

       Shapiro-Wilk normality test

data:  X[[2L]] 
W = 0.9134, p-value = 0.4295
person Wojciech Sobala    schedule 05.04.2011

Ваш код используется всеми возможными способами. Вот некоторые из них:

  1. Вы создаете myfactor вне цикла, но затем делаете его итератором.
  2. dataset1 — это ваши данные (data.frame?). Я даже не уверен, что myfactor будет внутри цикла, созданного for (myfactor in dataset1).
  3. Вы не разделяете данные, отправленные на shapiro.test.
  4. myvars не определено, и dataset1$Size, вероятно, должно быть dataset1$Height.

Попробуйте это вместо этого.

res <- list()
for (mf in levels(dataset1$Group)) {
    res[[mf]] <- shapiro.test(dataset1$Height[dataset1$Group == mf])
}
person Joshua Ulrich    schedule 05.04.2011

Спасибо за ответ.
На будущее:
Если вы хотите вычислить (для выбранных переменных в наборе данных) тест нормальности по фактору:

variaveis <- colnames(dataset1)[c(1:2)]
/////alternative: variaveis <- c("height", "weight") 
res<- vector("list", length(variaveis))

for (i in 1:length(variaveis)) {
    #calcula o shapiro por factor para variaveis selecionadas
    res[[i]] <- lapply(split(dataset1[,variaveis[i]] ,dataset1$sex), shapiro.test)
}
res

PS: в предыдущем примере секс = ГРУППА
Еще раз спасибо
Хотелось бы, чтобы этот код помог уменьшить код M.

person user772254    schedule 27.05.2011