Ringkasan
Dokumen ini menjelaskan langkah demi langkah simulasi data transek garis, pemodelan fungsi deteksi (half-normal) menggunakan paket unmarked dan Distance, serta estimasi kepadatan dan abundance. Semua kode disiapkan agar bisa dijalankan dalam R/RStudio dan menghasilkan output HTML.
library(unmarked)
library(Distance)
library(readxl)
library(dplyr)
library(ggplot2)
set.seed(123)
Penjelasan: unmarked dan Distance adalah paket populer untuk pemodelan data jarak (distance sampling). ggplot2 dan dplyr dipakai untuk visualisasi dan manipulasi data.
# Deteksi
# Area simulasi (meter)
area_width <- 1000
area_height <- 1000
# Populasi dan transek
n_individuals <- 500
n_transects <- 5
transect_length <- 1000 # meter (per transek)
max_distance <- 50 # jarak deteksi maksimum (meter)
sigma <- 30 # parameter skala untuk fungsi half-normal
# Total area (km^2)
total_area <- (area_width * area_height) / 1e6
cat("Total area (km^2):", total_area, "\n")
## Total area (km^2): 1
detection_probability <- function(distance, sigma=sigma) {
exp(-distance^2 / (2 * sigma^2))
}
# contoh: probabilitas deteksi pada jarak 0, 10, 30 m
data.frame(d= c(0,10,30)) %>%
mutate(p = detection_probability(d, sigma))
# Posisi individu
individuals <- data.frame(
x = runif(n_individuals, 0, area_width),
y = runif(n_individuals, 0, area_height)
)
# Posisi transek (garis horizontal), beri label
transect_y <- seq(100, 900,
length.out = n_transects)
transect_labels <- letters[1:n_transects]
transects <- data.frame(
Sample.Label = transect_labels,
y = transect_y,
Effort = transect_length / 1000 # konversi ke km untuk beberapa paket
)
transects
Deteksi bila jarak ke transek \(\le\) max_distance dan bernilai sesuai probabilitas
detected <- data.frame(x = numeric(), y = numeric(), distance = numeric(), transect = character())
for (i in 1:n_individuals) {
x <- individuals$x[i]
y <- individuals$y[i]
distances <- abs(y - transect_y)
min_distance <- min(distances)
transect_idx <- which.min(distances)
transect_label <- transect_labels[transect_idx]
if (min_distance <= max_distance) {
prob <- detection_probability(min_distance, sigma)
if (runif(1) < prob) {
detected <- rbind(detected, data.frame(x = x, y = y, distance = min_distance, transect = transect_label))
}
}
}
cat("Jumlah individu yg disimulasikan:", n_individuals, "\n")
## Jumlah individu yg disimulasikan: 500
cat("Jumlah individu terdeteksi:", nrow(detected), "\n")
## Jumlah individu terdeteksi: 175
head(detected)
Dokumen ini menampilkan dua jalur analisis:
unmarked: menggunakan unmarkedFrameDS (format data jarak yang dibin)
Distance: menggunakan fungsi ds (paket Distance) dengan format baris data dengan kolom distance, Label (transek), dan Transect/Effort/Region ketika diperlukan.
Catatan: unmarked::formatDistData memerlukan struktur tertentu. Di sini kita menyusun data binned secara manual dan membuat unmarkedFrameDS.
# Menggambarkan bin untuk jarak
breaks <- seq(0, 50, by = 10) # bins 0-15,15-30,...
# Buat unmarkedFrameDS — catatan: fungsi ini mengharapkan matriks y (site x bin)
yDat <- formatDistData(detected, distCol="distance", transectNameCol="transect",
dist.breaks=breaks)
## Warning in formatDistData(detected, distCol = "distance", transectNameCol =
## "transect", : The transects were converted to a factor
umf <- unmarkedFrameDS(
y = yDat, # jarak deteksi
siteCovs = NULL,
dist.breaks = breaks, # binning jarak
unitsIn = "m", # satuan jarak
survey = "line",
tlength = rep(1, 5) # panjang transek dalam km
)
umf
## Data frame representation of unmarkedFrame object.
## y.1 y.2 y.3 y.4 y.5
## a 11 10 6 5 3
## b 7 14 8 5 3
## c 10 7 11 2 5
## d 7 10 6 7 4
## e 11 11 5 4 3
Selanjutnya adalah melakukan pemodelan dengan menggunakan package unmarked, dengan keterangan model sebagai berikut: model deteksi: distribusi Multinomial model densitas: distribusi Poisson
model <- distsamp(
formula = ~1 ~1, # model deteksi dan densitas tanpa kovariat
data = umf,
keyfun = "halfnorm", # fungsi deteksi half-normal
output = "density", # keluaran densitas (individu/km^2)
unitsOut = "kmsq"
)
summary(model)
##
## Call:
## distsamp(formula = ~1 ~ 1, data = umf, keyfun = "halfnorm", output = "density",
## unitsOut = "kmsq")
##
## Density (log-scale):
## Estimate SE z P(>|z|)
## 13.2 0.104 127 0
##
## Detection (log-scale):
## Estimate SE z P(>|z|)
## 3.4 0.111 30.5 1.57e-204
##
## AIC: 109.5884
## Number of sites: 5
## optim convergence code: 0
## optim iterations: 40
## Bootstrap iterations: 0
##
## Survey design: line-transect
## Detection function: halfnorm
## UnitsIn: m
## UnitsOut: kmsq
# Contoh sederhana: bootstrap kepadatan rata-rata dari model unmarked jika model tersedia
getN.hat <- function(fit, A = 1) {
d <- predict(fit, type = "state")$Predicted
mean(d) * A
}
parboot(model, statistic = getN.hat, nsim = 100)
## Running parametric bootstrap in parallel on 7 cores.
##
## Call: parboot(object = model, statistic = getN.hat, nsim = 100)
##
## Parametric Bootstrap Statistics:
## t0 mean(t0 - t_B) StdDev(t0 - t_B) Pr(t_B > t0)
## 1 515336 3897 51172 0.446
##
## t_B quantiles:
## 0% 2.5% 25% 50% 75% 97.5% 100%
## t*1 381746 413776 479028 505476 550512 606716 619972
##
## t0 = Original statistic computed from data
## t_B = Vector of bootstrap samples
Visualisasi: histogram jarak dan kurva half-normal sejati
Ringkasan hasil
{r results} cat(“Jumlah individu disimulasikan:”, n_individuals, “”) cat(“Jumlah individu terdeteksi:”, nrow(detected), “”)
if (exists(“model_um”) && !is.null(model_um)) { dens_um <- mean(predict(model_um, type = “state”)$predicted) cat(sprintf(“Densitas rata-rata (unmarked): %.6f individu/km^2”, dens_um)) cat(sprintf(“Abundance estimasi (unmarked) untuk area: %.2f individu”, dens_um * total_area)) }
if (exists(“m0”)) { print(summary(m0)) }
Catatan akhir
Susunan ini dimaksudkan sebagai template yang bisa Anda modifikasi sesuai struktur data nyata (mis. kolom nama transek/label, kolom ukuran kelompok, unit jarak).
Jika Anda memiliki file Excel nyata (dist2.xlsx) yang ingin dipakai, cukup baca file tersebut (contoh: dist <- read_excel(“dist2.xlsx”)) lalu sesuaikan nama kolom agar sesuai dengan distance dan Label.
Jika Anda ingin saya mengadaptasi dokumen ini ke dataset Anda (mis. menyesuaikan nama kolom pada dist2.xlsx), unggah file atau beri tahu struktur kolom.