trajr: Analýza a vizulaice trajektorií zvířat

Co je Trajr a k čemu slouží?

trajr je balíček pro R studio, který se zaměřuje na jednoduchou analýzu a vizualizaci dvoudimenziálních dat.

Instalace balíčku

library(trajr)

Funkce balíčku - vytvoření a operace s trajektorií

Balíček nabizí možnost vygenerování vlastní náhodné trajektorie pomocí příkazu “TrajGenerate” Základní argumenty “TrajGenerate”:

• n: počet kroků v trajektorii

• random: pro nahodné hodnoty zadáme “TRUE”

• stepLength: dékla kroků v trajektorii

• angularErrorSd: směrodatná odchylka v radianech

data_g <- TrajGenerate(200, random = TRUE, angularErrorSd = .25)

Data-frame bude tedy vypadat:

head(data_g)

Vytvoření trajektorie

Načtení vlastních dat:

library(trajr)

gepard <- read.table("Gepard_1.csv", header = T, sep = ";", dec=",")
gepard$time = as.POSIXct(gepard$time)
gepard$Height = as.numeric(gepard$Height)

library(sf)
## Warning: package 'sf' was built under R version 4.0.4
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
floor((180+gepard$long[1])/6) + 1
## [1] 35
gepard_sf <- st_as_sf(gepard, coords = c("long", "lat"), crs = 4326)
gepard_utm <- st_transform(gepard_sf, crs = 32635)
gepard <- cbind(gepard_utm, st_coordinates(gepard_utm))

gepard$X <- gepard$X/1000
gepard$Y <- gepard$Y/1000

Níže v tabulce lze vidět výpis s načtených dat. Sloupec:

• ID: ID jedince

• X: souřadnice x

• Y: souřadnice y

• time: čas v hodinách, ve kterém se jedinec nacházel na určitém místě

head(gepard)

Důležitým krokem pro tvorbu trajektorie je si vždy vytvořit “trajektorii jako objekt”, pomocí “TrajFromCoords”, kde je potřeba použít následující argumenty:

• xCol: název sloupce v našem souboru obsahující souřadnice x

• yCol: název sloupce v našem souboru obsahující souřadnice y

• timeCol: název sloupce, ve kterém máme uvedený čas

trj <- TrajFromCoords(gepard, xCol = "X", yCol = "Y", timeCol = "time")
trj_2 <- TrajFromCoords(data_g)

Vizualizace trajektorie

Pro vizualizaci trajektorie se ze začátku použije jednoduchá funkci a to “plot”

plot(trj, main= "Vizualizace trajektorie geparda", col="black")

plot(trj_2, main = "Generovaná data")

Pro vyhlazení, snížení vysokofrekvenčního šumu a zároveň zachování původní trajektorie použitím vyhlazovacího filtru Savitzky-Golay se používá funkce ”trajSmootSG".

# načtená data
p=9
n=p + 3 - p%%2
smoothed <- TrajSmoothSG(trj, p, n)

plot(trj, main= "Vizualizace trajektorie geparda", col="black")

plot(smoothed, lwd=1, lty=1, main = "Gepard - smoothed")
lines(smoothed, col="blue", lwd=0.5)

legend("topright", c("Původní", "Vyhlazená"), lwd = c(1, 2), lty = c(1, 1), col = c("black", "blue"), inset = 0.01)

# vygenerovaná data
plot(trj_2, lwd=1, lty=1, main = "Generovaná data")

smoothed <- TrajSmoothSG(trj_2, p=3, n =31)

lines(smoothed, col="red", lwd=2)

legend("topright", c("Původní", "Vyhlazená"), lwd = c(1, 2), lty = c(1, 1), col = c("black", "red"), inset = 0.01)

## Převzorkování trajektorie Funkce “TrajRediscretize” se upraví délku kroku na pevnou vzdálenost. Argumenty:

• trj: vstupní trajektorie

• R: délka kroku (v našem případě m)

Pro výběr délky kroku neexistují žádné jasná pravidla. Pokud se použije malá délka kroku, tak operace vede k převzorkování, která způsobí vysokou autokorelaci mezi kroky a vysokou variabilitu. V případě použití větší délky dojde k pod vzorkování a díky tomu ke ztrátě informací. Od této části se začíná pro zjednodušení pracovat pouze jen s generovaný daty.

trj3 <- TrajGenerate(10, stepLength = 2)

plot(trj3, lwd = 1.5, main = "Generovaná data")
points(trj3, draw.start.pt = F, pch=16, col="black", cex=1)

resampled <- TrajRediscretize(trj3, 2)

lines(resampled, col="red", lwd=1)
points(resampled, col="red",type = 'p', pch = 16)
legend("topright", c("Původní", "Upravená"), lwd = c(1, 2), lty = c(1, 1), col = c("black", "red"), inset = c(0.01, 0.02))

Funkce “TrajResampleTime” upraví trajektorii a vytvoří novou s pevnými časovými intervaly kroku. Argumenty:

• trj: vstupní trajektorie

• steptime: časový interval

trj3 <- TrajGenerate(10, stepLength = 1, fps = .5, timeUnits = "hours", linearErrorSd = .8)
plot(trj3, lwd = 1.5, main="Generovaná data")
points(trj3, draw.start.pt = FALSE, pch = 16, col = "black", cex = 1.2)

resampled <- TrajResampleTime(trj3, 1)

lines(resampled, col = "red", lwd = 2)
points(resampled, type = 'p', col = "red", pch = 16)
legend("topright", c("Originálná", "Upravená"), col = c("black", "red"), 
       lwd = 2, inset = c(0.01, 0.02))

Další operace s trajektroií

Otočení trajektrie

K otočení trajektorie se používá funkce “TrajRotate”.

trj_rotate <- TrajRotate(trj_2)

plot(trj_rotate, main = "Otočená trajektorie")

Obrácení trajktorie

Funkce “TrajReverse” trajektorii jednoduše obrátí – změní počátek a konec trajektorie.

trj_Reverse <- TrajReverse(trj_2)
plot(trj_Reverse, main="Obrácený trajektore")

nalýza trajektorie

K analýze trajektorie lze postoupit až ve chvíli kdy už je trajektorie správně upravená.

###Analýza rychlosti/trajektroie : V balíčku existuje nekolik funkce zabývající se analýzou rychlosti.

• TrajAcceleration: odhad zrychlení jako vektoru v každém bodě trajektorie pomocí konečných rozdílů druhého řádu

• TrajDerivatives: odhad rychlosti jako vektoru v každém bodě trajektorie pomocí rozdílu prvního řádu

derivs <- TrajDerivatives(smoothed)

plot(derivs$acceleration ~ derivs$accelerationTimes, type = 'l', col = 'red', 
     yaxt = 'n',
     xlab = 'Time (s)',
     ylab = expression(paste('Change in speed (', m/s^2, ')')))
axis(side = 2, col = "red")
lines(derivs$speed ~ derivs$speedTimes, col = 'blue')
axis(side = 4, col = "blue")
mtext('Speed (m/s)', side = 4)
abline(h = 0, col = 'lightGrey')

Když je získaná rychlost trajektorie, tak lze jednoduše vypočítat hodnoty jako jsou:

• střední hodnota (mean(derivsspeed))

• maximální hodnota rychlosti(max(derivsspeed))

• maximální hodnota rychlosti(max(derivsspeed))

• minimální hodnota rychlosti (min(derivs$speed))

summary(derivs$speed)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   72.76   90.55   96.23   94.77   98.88  137.90

Funkce “TrajSpeedIntervals” umožňuje určit časové intervaly v rámci trajektorie. Díky ní lze najít intervaly, kdy je rychlost nižžší/vyšší než rychlost určená, nebo jejich kombinace. Argumetny:

• trj: trajektorie

• fasterThan: rychlejší než námi zadaná hodnota

• sloweThan: pomalejší než námi zadaní hodnota

intervals <- TrajSpeedIntervals(smoothed, slowerThan = 20)
print(intervals)
## [1] startFrame startTime  stopFrame  stopTime   duration  
## <0 rows> (or 0-length row.names)
plot(intervals)

## Náhodné generování trajektorie ###Generování náhodné procházky

random  <- TrajGenerate(n = 200)

plot(random, main = "Nádoná trajektorie procházky")

Generování “přimočaré” trajektorie

direct <- TrajGenerate(n = 20, random = FALSE)
plot(direct, main="Přímočará procházka")

Brownův pohyb

brown <- TrajGenerate(n = 500, angularErrorDist = function(n) stats::runif(n, -pi, pi))
plot(brown, main = "Brownův pohyb")

Lévy flight s Cauchyho rozdělením

levy <- TrajGenerate(linearErrorDist = stats::rcauchy)
plot(levy, main="Lévy Flight")