Как я могу вычислить эмпирический CDF в R?
-
29-09-2019 - |
Вопрос
Я считываю разреженную таблицу из файла, который выглядит как:
1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1
Обратите внимание, что длина строк различна.
Каждая строка представляет собой одну симуляцию.Значение в i-м столбце в каждой строке указывает, сколько раз значение i-1 наблюдалось в этом моделировании.Например, в первом моделировании (первая строка) мы получили один результат со значением '0' (первый столбец), 7 результатов со значением '2' (третий столбец) и т.д.
Я хочу создать среднюю кумулятивную функцию распределения (CDF) для всех результатов моделирования, чтобы позже я мог использовать ее для вычисления эмпирического p-значения для истинных результатов.
Чтобы сделать это, я могу сначала суммировать каждый столбец, но мне нужно взять нули для столбцов undef.
Как мне прочитать такую таблицу с разной длиной строк?Как мне суммировать столбцы, заменяя значения 'undef' на 0'?И, наконец, как мне создать CDF?(Я могу сделать это вручную, но я предполагаю, что есть какой-то пакет, который может это сделать).
Решение
Это позволит считывать данные в:
dat <- textConnection("1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1")
df <- data.frame(scan(dat, fill = TRUE, what = as.list(rep(1, 29))))
names(df) <- paste("Val", 1:29)
close(dat)
Приводящий к:
> head(df)
Val 1 Val 2 Val 3 Val 4 Val 5 Val 6 Val 7 Val 8 Val 9 Val 10 Val 11 Val 12
1 1 0 7 0 0 1 0 0 0 5 0 0
2 1 0 0 1 0 0 0 3 0 0 0 0
3 0 0 0 1 0 0 0 2 0 0 0 0
4 1 0 0 1 0 3 0 0 0 0 1 0
5 0 0 0 1 0 0 0 2 0 0 0 0
....
Если данные находятся в файле, укажите имя файла вместо dat
.Этот код предполагает, что существует максимум 29 столбцов, согласно предоставленным вами данным.Изменить 29
в соответствии с реальными данными.
Мы получаем суммы столбцов, используя
df.csum <- colSums(df, na.rm = TRUE)
тот самый ecdf()
функция генерирует ECDF, который вы хотели,
df.ecdf <- ecdf(df.csum)
и мы можем построить его, используя plot()
способ:
plot(df.ecdf, verticals = TRUE)
Другие советы
Вы можете использовать ecdf()
(в базе R) или Ecdf()
(из Hmisc пакет) функций.