Тест Колмогорова-Смирнова в R - For-loop - PullRequest
0 голосов
/ 20 апреля 2020

У меня проблема со сравнением двух наборов кривых с помощью теста Колмогорова-Смирнова.

Я хотел бы, чтобы программа сравнивала каждую вариацию кривой 1 с каждой вариацией кривой 2. Для достижения sh этого я попытался построить для-l oop, который перебирает кривую 1, и внутри этого l oop еще один l oop, перебирающий кривую 2.

К сожалению, при выполнении кода я получаю сообщение об ошибке

«недостаточно x-Data»

Когда я пытаюсь запустить тест, сравнивая один вариант каждой кривой вручную, он работает, поэтому я думаю, что проблема заключается в комбинации двух циклов и KS -test.

Если кто-либо сталкивался с подобной ошибкой и смог решить ее, я был бы очень признателен за любые советы по ее устранению. Спасибо!

Пример data.frames:

Kurve1 <- structure(list(Punkte = 1:21,
                         Trial.1 = c(105.5, 85.3, 63.1, 54.9, 42, 34.1, 30.7,
                                     24.2, 20.1, 15.7, 14, 11, 9.3, 7.2, 6.6,
                                     5.3, 4.2, 3.3, 2.6, 1.8, 0.9),
                         Trial.2 = c(103.8, 85.2, 64.3, 54.1, 41.8, 35.9, 29,
                                     23.7, 20.2, 15.9, 13.5, 11, 9.3, 7.3, 6.4,
                                     5.5, 4.3, 3.4, 2.5, 1.9, 0.9),
                         Trial.3 = c(104.8, 87.2, 64.9, 52.8, 40.8, 35.6, 29.1,
                                     24.5, 20.4, 16.2, 13.7, 11.2, 9.2, 7.5,
                                     6.4, 5.5, 4.2, 3.5, 2.5, 1.8, 0.9),
                         Trial.4 = c(106.9, 83.9, 67.1, 55.1, 44.1, 34.1, 29.3,
                                     22.9, 19.4, 16.7, 13.6, 10.8, 9.4, 7.4,
                                     6.1, 5.6, 4.4, 3.5, 2.4, 1.9, 0.9),
                         Trial.5 = c(104.8, 84.3, 68.7, 54.8, 45.3, 35.2, 28.9,
                                     23.1, 20.1, 16.9, 13.3, 11, 9.6, 7.1, 6.3,
                                     5.4, 4.5, 3.4, 2.3, 2, 0.9)),
                    class = "data.frame", row.names = c(NA, -21L))

Kurve2 <- structure(list(Punkte = 1:21,
                         Trial.1 = c(103.5, 81.2, 66.2, 54.5, 45.1, 39.1, 30.9,
                                     27, 21.9, 19.3, 16.6, 14.9, 12.9, 11, 10.1,
                                     9.2, 8, 7.1, 6.3, 6.2, 5),
                         Trial.2 = c(104, 81, 66.9, 55.2, 46, 38.7, 31.2, 27.3,
                                     22.3, 20, 17.2, 15.2, 12.9, 11.1, 10.2,
                                     9.1, 8, 7.1, 6.4, 5.9, 5),
                         Trial.3 = c(103.9, 81.9, 67.2, 53.8, 45.4, 38.5, 31.5,
                                     26.8, 22.2, 19.8, 17.4, 15.1, 13, 10.9,
                                     10.1, 9.2, 8.1, 7.1, 6.4, 6, 4.9),
                         Trial.4 = c(104.2, 84.1, 68.7, 55.4, 45.1, 36.3, 32,
                                     26.9, 22.8, 19.8, 16.8, 14.8, 13.2, 10.9,
                                     10.3, 9.1, 8.2, 7.2, 6.3, 6.1, 5),
                         Trial.5 = c(103.8, 83.2, 69.2, 55.7, 44.8, 36.4, 31.4,
                                     26.7, 22.1, 18.9, 16.9, 14.4, 13, 11.1,
                                     10.2, 9, 7.9, 7, 6.3, 6.1, 5.1)),
                    class = "data.frame", row.names = c(NA, -21L))

Код, который я использовал для l oop:

for(i in 1:ncol(Kurve1)){
   for(j in 1:ncol(Kurve2)){
      ks.test(Kurve1$Trial.[i], Kurve2$Trial.[j], alternative = "greater")
   }
   }

1 Ответ

0 голосов
/ 21 апреля 2020

Это будет работать:

for(i in 1:(ncol(Kurve1) - 2)){
  for(j in (i + 1):(ncol(Kurve2) - 1)){
    print(paste0("Trial.", i, " - Trial.", j))
    ks_result <- ks.test(Kurve1[, paste0("Trial.", i)],
                         Kurve2[, paste0("Trial.", j)],
                         alternative="greater")
    print(ks_result)
  }
}

Объяснение:

  1. Поскольку нет смысла запускать тест KS для того же столбца, а также не имеет смысла баллотироваться на Trial.1 ~ Trial.2 и Trial.2 ~ Trial.1, и т. д. c. Вы должны запустить свой внешний for l oop с 1 до последнего, кроме одного ((ncol(Kurve1) - 2)) индекс для Trial.* столбцов, и вам нужно запустить свой внутренний for l oop от следующего индекса, поскольку внешний l oop имеет (i + 1) до последнего индекса ((ncol(Kurve2) - 1)) для Trial.* столбцы.

  2. Нельзя вставлять строки, такие как Trial.[i], для этого необходимо использовать функцию paste. Поскольку запись Kurve1$paste0("Trial.", i) не работает, вы должны использовать оператор извлечения [, чтобы получить необходимый столбец (Kurve1[, paste0("Trial.", i)])

  3. Как в (вложенном) для l oop ks.test работает тихо, a добавили print, чтобы увидеть результаты. Я также добавил строку print(paste0("Trial.", i, " - Trial.", j)), чтобы пометить фактический результат столбцами, которым он принадлежит.

...