Секс на R — 07. Довідник II (Матеріали). Типові засоби створення моделей у курсі

 

"Секс на R"
Онлайн-матеріали до курсу "Еволюція сексу і статевих стратегій: моделювання на R"

Д.А. Шабанов

Типова побудова моделей у курсі Довідник II. Типові засоби створення моделей у курсі
(у процесі поступового наповнення)
Моделювання добору за однією спадковою ознакою
"Секс на R"-06 "Секс на R"-07 "Секс на R"-08

 

Типові засоби створення моделей у курсі

Задум цієї сторінки простий: зібрати тут фрагменти моделей, які корисні при створенні нових моделей. Процес це довгий, не у всьому зрозумілий (наприклад, слід вирішити, у якому порядку розташовувати "заготовини"), але, у будь-якому разі, його вже почато.

На цей час додані наступні "заготовини":

Створення пустого вектору певної довжини
Створення пустої матриці з іменованими рядками та стовпцями
Запис у файл та читання з файлу об’єкту з даними
Ймовірнісне округлення
Моделювання добору за допомогою функції sample та “вектора долі”
Перемикач у разі множинного вибору: switch()
Перебір значень початкових параметрів
Тривимірна візуалізація результатів перебору параметрів
Створення власної функції для конкурентного скорочення чисельності

 

Створені в R імітаційні моделі використовують певний набір стандартних засобів. В цьому документі ми будемо збирати ці техніки.

Useful Simulation Techniques

Створення пустого вектору певної довжини

amount <- 10
vect <- rep(NA, amount)
vect
##  [1] NA NA NA NA NA NA NA NA NA NA

Створення пустої матриці з іменованими рядками та стовпцями

rws <- c("One", "Two", "Three", "Four", "Five")
cls <- c("First", "Second", "Third", "Fourth", "Fifth", "Sixth")
mtrx <- matrix(NA, nrow = length(rws), ncol = length(cls), dimnames = list(rws, cls))
mtrx
##       First Second Third Fourth Fifth Sixth
## One      NA     NA    NA     NA    NA    NA
## Two      NA     NA    NA     NA    NA    NA
## Three    NA     NA    NA     NA    NA    NA
## Four     NA     NA    NA     NA    NA    NA
## Five     NA     NA    NA     NA    NA    NA

Запис у файл та читання з файлу об’єкту з даними

Object <- 1
save(Object, file = "temp.RData")
rm(list = ls()) # Очищення раніше збережених об'єктів в Environment
#save(Object, file = "/home/dsh/R/!_Courses/Sex_on_R/temp.RData")
load("temp.RData")
Object
## [1] 1
#load("/home/dsh/R/!_Courses/Sex_on_R/temp.RData")

Ймовірнісне округлення

Можна використовувати і функцію floor(), і функцію trunc(). До величини, яку треба ймовірнісно округлити, додається випадкова величина, що рівномірно розподілена між 0 та 1; сума округлюється до нижчого (у разі позитивних чисел) цілого.

У наведеному прикладі середнє з 100 округлень величини 3.3 має бути достатньо близьким до цієї величини.

ProbabRound <- rep(NA, 1000)
for (i in 1:1000) {ProbabRound[i] <- floor(3.3 + runif(1))}
mean(ProbabRound)
## [1] 3.296

Формування випадкової вибірки за допомогою функції sample

Функція sample(x, size, replace = FALSE, prob = NULL) може використовуватися як для генерації наборів випадкових цілих чисел, так і для вибору певної кількості об’єктів з їх сукупності. Два перші аргументи є обов’язковими: x — це діапазон, з якого здійснюється вибір, а size — розмір вибірки. Два наступних параметри є опціональними. Якщо вони не вказані, R використовує ті значення, що наведені у наведеному зразку повного запису аргументів. Так, параметр replace визначає, чи можна повторно обирати елемент, який вже був вибраний. У разі replace = FALSE після того, як обрано перший елемент, обране значення забирається з числа тих, які можуть бути обраними. Якщо вказати replace=TRUE, команда обиратиме кожний наступний елемент з повної сукупності.

sample(1:10, 9)
## [1] 2 9 7 8 4 1 3 6 5
# sample(1:10, 11) # Тут мало б бути повідомлення про помилку
sample(1:10, 11, replace=T) # Тут усе нормально: елементи можна обирати повторно
##  [1] 6 2 8 1 9 4 3 1 6 9 7

Моделювання добору за допомогою функції sample та “вектора долі”

У попередньому прикладі наведено зразок використання функція sample(). Її можна використати для моделювання добору. Припустимо, проти особин, що перелічені у векторі Al_Pop перелічені особини, проти яких діє добір s. Величина s лежить у межах від 0 (усі виживають) до 1 (усі гинуть). Особини, на користь яких працює добір, у цьому випадку виживають усі. Звісно, неконкурентна смертність, що однаково проріджує як тих, так і інших, може бути скільки завгодно потужною.

s <- sample(2:5, 1) / 10 # Випадково обирається значення добору
s
## [1] 0.4
Al_Pop <- sample(1:100, 12) # Сукупність, яка зазнає дії добору
Al_Pop
##  [1] 37 47 56 49 15 27 35 65 74 82 62  4
Fate <- c(rep(NA, s*10), rep(1, (10-s*10))) # Вектор "долі"
Fate # (один на весь скрипт; він не є випадковим)
##  [1] NA NA NA NA  1  1  1  1  1  1
Lot <- sample(Fate, length(Al_Pop), replace = T) # Вектор "жереба" 
Lot # (створюється окремо для кожного скорочення)
##  [1] NA NA NA  1  1 NA  1 NA  1  1  1 NA
Be_Pop <- Al_Pop * Lot # Скорочена сукупність; загіблі - NA
Be_Pop
##  [1] NA NA NA 49 15 NA 35 NA 74 82 62 NA
Ga_Pop <- na.omit(Be_Pop) # Остаточно скорочена сукупність
Ga_Pop
## [1] 49 15 35 74 82 62

Перемикач у разі множинного вибору: switch()

Залежно від того, яке значення приймає певна величина (у прикладі вона названа Way), слід робити ті чи інші дії. Для цього використовується перемикач switch(). Величина Way має приймати значення натурального ряду. Якщо вона приймає значення з якогось переліку, можна зробити список можливих значень та впорядкувати його, як показано на початку прикладу.

Randoms = sample(10:99, 5)
Randoms
## [1] 27 32 63 93 56
Rando <- sort(unique(Randoms))
Rando
## [1] 27 32 56 63 93
x <- sample(Rando, 1)
x
## [1] 56
Way <- which(x == Rando)
switch(Way, 
       print(Rando[1]),
       {print(Rando[2]); print("Second")},
       {print(Rando[3]); (a <- x^2)},
       print(Rando[4]),
       print(Rando[5]))
## [1] 56
## [1] 3136

Перебір значень початкових параметрів

Застосовується у моделях ІІІ типу

vector_First <- c(100, 200, 300, 400)
vector_Second <- c(0.1, 0.2, 0.3, 0.4, 0.5)
Outcome <- matrix(NA, nrow = length(vector_First), ncol = length(vector_Second), dimnames = list(vector_First, vector_Second))
for (a in 1:length(vector_First)){
   First <- vector_First[a] 
   for (b in 1:length(vector_Second)){ 
      Second <- vector_Second[b] 
      Outcome[a, b] <- First + Second * 100 # Тут розташовані основні розрахунки результату
   }}
Outcome
##     0.1 0.2 0.3 0.4 0.5
## 100 110 120 130 140 150
## 200 210 220 230 240 250
## 300 310 320 330 340 350
## 400 410 420 430 440 450

Тривимірна візуалізація результатів перебору параметрів

У попередньому прикладі згенеровано матрицю Outcome. Візуалізувати її можна таким чином

# install.packages("plot3D")
library(plot3D)
persp3D(z = Outcome, x = vector_First, y = vector_Second, theta = 330, phi = 30, # Побудова графіку
        zlab = "Результат", xlab = "First", ylab = "Second",
        expand = 0.6, facets = FALSE, scale = TRUE,  ticktype = "detailed",nticks = 5, cex.axis=0.9, 
        clab = "Кольорова шкала", colkey = list(side = 2, length = 0.5))


Створення власної функції для конкурентного скорочення чисельності

Входом є три об’єкти: Capacity — це місткість середовища. Amounts — чисельності скорочуваних груп, що конкурують за Capacity, а Competitiveness — конкурентоздатність цих груп. Детальніше використаний алгоритм конкурентного скорочення розглядається тут.

Виходом є нові, скорочені чисельності груп, що розглядаються.

CompetitiveReduction <- function(Capacity, Amounts, Competitiveness){
  RelativCompetit <- Competitiveness/max(Competitiveness); Quoted <- RelativCompetit * Amounts
  Way <- ifelse(sum(Amounts) <= Capacity, 1, ifelse(sum(Quoted) >= Capacity, 2, 3))
  Reduced <- switch(Way, # Defines a formula for calculations based on value Way
                    Amounts, # If Way==1
                    round(Quoted*Capacity/sum(Quoted)), # If Way==2, & on next row — if Way==3:
                    round(Amounts-(Amounts-Quoted)*(sum(Amounts)-Capacity)/(sum(Amounts)-sum(Quoted))) )}