Выбор образцов, которые максимально охватывают биологический градиент - PullRequest
0 голосов
/ 19 июня 2020

У меня есть несколько резервуаров, покрывающих градиент солености (см. Прикрепленный файл; единица измерения произвольная). Моя задача - выбрать 15 танков, которые лучше всего покрывают градиент. Однако некоторые диапазоны солености чрезмерно представлены в данных. Таким образом, есть вероятность, что эта соленость windows будет чрезмерно представлена, если я буду выбирать резервуары регулярно. Есть ли возможность исправить это с помощью языка программирования R? Если есть специальный пакет R для выполнения этой работы, это тоже будет очень полезно.

Заранее большое спасибо!

Gradient_salinity

1 Ответ

0 голосов
/ 19 июня 2020

Без воспроизводимого примера мне пришлось заново воссоздавать ваши данные, и они не будут точными:

library(ggplot2)

ggplot(df, aes(Tank, Salinity)) + 
  geom_col() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

enter image description here

Если вы хотите получить приблизительно равномерный охват солености, все, что вам нужно сделать, это выяснить, как будет выглядеть идеальное оптимальное покрытие диапазона более 15 резервуаров. Другими словами, вы делите свой диапазон поровну между минимальным и максимальным диапазоном и выясняете, где будет идеальная соленость ваших 15 резервуаров:

optima  <- seq(min(df$Salinity), max(df$Salinity), length.out = 15)

Теперь все, что вам нужно сделать, это найти ближайший резервуар для каждого из этих оптимумов:

optimal <- sapply(optima, function(i) which.min(abs(df$Salinity - i)))

Итак, теперь, если мы построим только эти 15 резервуаров, мы увидим, что получим гораздо более линейный охват солености:

ggplot(df[optimal, ], aes(Tank, Salinity)) + 
  geom_col() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

enter image description here


Используемые данные

df <- structure(list(Tank = structure(1:35, .Label = c("24", "23", 
"33", "2", "18", "11", "35", "34", "20", "5", "16", "10", "31", 
"22", "13", "30", "9", "7", "28", "29", "21", "15", "32", "14", 
"8", "6", "12", "17", "4", "27", "26", "1", "25", "19", "3"), class = "factor"), 
    Salinity = c(0.18, 0.4, 0.45, 0.52, 0.57, 0.62, 0.7, 0.75, 
    0.76, 0.78, 0.79, 0.81, 0.84, 0.86, 0.9, 0.91, 0.99, 1.01, 
    1.02, 1.04, 1.1, 1.2, 1.25, 1.26, 1.3, 1.31, 1.4, 1.45, 1.65, 
    1.78, 1.85, 1.87, 1.88, 2.2, 2.25)), row.names = c(NA, -35L
), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...