R: итерация по переменной - PullRequest
0 голосов
/ 05 апреля 2011

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

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

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

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. Может кто-нибудь помочь мне разобраться в чем дело?

Ответы [ 3 ]

3 голосов
/ 05 апреля 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])
}
3 голосов
/ 05 апреля 2011

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

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
1 голос
/ 27 мая 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: sex = GROUP в предыдущем примере
Еще раз спасибо
Желаю, чтобы этот код помог уменьшить код M.

...