trajr je balíček pro R studio, který se zaměřuje na jednoduchou analýzu a vizualizaci dvoudimenziálních dat.
library(trajr)
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)
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)
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))
K otočení trajektorie se používá funkce “TrajRotate”.
trj_rotate <- TrajRotate(trj_2)
plot(trj_rotate, main = "Otočená trajektorie")
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")
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")
direct <- TrajGenerate(n = 20, random = FALSE)
plot(direct, main="Přímočará procházka")
brown <- TrajGenerate(n = 500, angularErrorDist = function(n) stats::runif(n, -pi, pi))
plot(brown, main = "Brownův pohyb")
levy <- TrajGenerate(linearErrorDist = stats::rcauchy)
plot(levy, main="Lévy Flight")