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.

1. Memuat paket yang diperlukan

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.

2. Parameter simulasi

# 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

3. Fungsi deteksi (half-normal)

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))

4. Mensimulasikan populasi dan transek

# 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

5. Simulasi deteksi

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)

6. Menyiapkan data untuk paket unmarked dan Distance

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.

7. Analisis dengan unmarked (distsamp)

Catatan: unmarked::formatDistData memerlukan struktur tertentu. Di sini kita menyusun data binned secara manual dan membuat unmarkedFrameDS.

Menyiapkan Data

# 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
  1. Bootstrapping untuk mendapatkan interval kepercayaan (contoh pendek)
# 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
  1. Visualisasi: histogram jarak dan kurva half-normal sejati

  2. 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.