У меня есть регулярно обновляемая биологическая база данных, в настоящее время содержащая записи 13 500 особей по 250 видам (виды = уровни факторов в 1-й колонке). Каждый человек имеет уникальный идентификатор (2-й столбец). Для каждого человека было зарегистрировано 7 различных измерений (столбцы 3-9). С таким количеством значений, введенных в базу данных вручную, я уверен, что некоторые опечатки произошли и создали выбросы, например, измерение, которое должно читать 15.2, могло быть введено как 1.52 или 152 или 25.2. Я хотел бы идентифицировать эти выбросы, чтобы я мог их исправить, а не уничтожать, но существует слишком много видов, чтобы делать это в каждом конкретном случае. Как я могу автоматизировать и организовать результаты поиска выбросов для каждого подмножества измерений по каждому виду? Эта последняя часть имеет решающее значение, поскольку каждый вид может быть разного размера с радикально различными измерениями. Я пытаюсь максимально упростить процесс, поскольку это, скорее всего, будет происходить каждый раз, когда в базу данных добавляется новый пакет данных (или пока кто-то не найдет лицензию для создателя файла).
Я анализирую в R. Я думаю, что вложенный цикл for для всех значений, выходящих за 2 или 3 стандартных отклонения от среднего значения, сработает, и / или group_by с dplyr и функцией квантиля. Но я не смог понять, как запустить все столбцы одновременно, возвращая фактические значения выбросов. Есть целый ряд других вопросов, касающихся этих частей, но я не могу найти ни одного, который бы соединил все это.
Пример данных:
df = data.frame(
species = c("a","b","a","b","a","b","a","b","a","b"),
uniqueID = c("x01","x02","x03","x04","x05","x06","x07","x08","x09","x10"),
metric1 = c(1,2,3,1,2,3,1,2,3,11),
metric2 = c(4,5,6,4,5,6,55,4,5,6),
metric3 = c(0.7,7,8,9,7,8,9,77,8,9)
)
Что касается ожидаемых результатов, я представляю данные типа data.frame или матрицы, уникальный_ID, измерение / столбец с выбросом и само значение выброса. Но то, как это отформатировано, менее важно, например.
outliers = data.frame(
species = c("a","a","b","b"),
uniqueID = c("x01","x07","x08","x10"),
var = c("metric3","metric2","metric3","metric1"),
value = c(0.7,55,77,11)
)
Заранее спасибо!