Risultati diversi nelle metriche calcolate con LAStools e lidR

Aug 15 2020

Ho un modello di altezza del baldacchino calcolato da dati TLS ad alta densità su un terreno di 60 x 200 metri. Ho provato a calcolare i voxel con LAStools e lidR e ho ottenuto risultati significativamente diversi. Mi chiedevo se qualcuno possa chiarire cosa sta succedendo. Script Lastools che ho usato:

lasvoxel -i infile.laz -drop_class 2 -step 0.5 -o outfile.las

number of voxels: 189077 

codice lidR:

las = readLAS("infile.laz", select = "xyzc", filter = "-drop_class 2 -drop_z_below 0 ")
voxels <- voxelize_points(las, res = 0.5)

number of voxels: 196257 

Calcolate anche l'asimmetria e la curtosi dell'altezza della chioma: LAStools:

lascanopy -i infiles\*.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o outfile.csv

Risultato:

plots        ske       kur
72a-4.laz   1.0905  5.58125
11a-4.laz   0.362   2.594
34-2.laz    0.1675  2.00875
63a-1.laz   -0.3115 2.36

lidR:

library(e1071)

files <- list.files(path= "/files", pattern= "*.laz", full.names = TRUE, recursive = FALSE)
O = lapply(files, function(x) {

  las <- readLAS(x, select = "xyzc") 

  z <- las$Z
  z_canopy <- z[z>=1.3]
  skew <- skewness(z_canopy)
  kur <- kurtosis(z_canopy)
  
  return(data.frame(file=x, skewH = skew, kurH=kur))
})

Risultato:

plots          ske        kur
72a-4.laz   1.090595768  2.58132381
11a-4.laz   0.362007296  -0.40599745
34-2.laz    0.167542141  -0.991227478
63a-1.laz   -0.311523396 -0.640029907

Come possiamo vedere, i risultati per l'asimmetria sono gli stessi, ma i valori della curtosi sono molto diversi. Qualcuno può aiutarmi a capire perché c'è una così grande differenza?

Risposte

3 JRR Aug 15 2020 at 19:34

Per quanto riguarda il numero di voxel, ciò può essere spiegato dall'allineamento dei voxel. lidRcentra il voxel a res/2significare che il fondo del voxel terreno è a 0 non al centro. Se LAStools ha voxel centrati su 0, lo spostamento può spiegare la differenza. Non ho cercato di esserne sicuro, ma questo ha senso.

Riguardo all'asimmetria e alla curtosi, la tua domanda è mal posta. Non stai chiedendo perché lidRfornisce un output diverso da LAStoolsma perché e1071fornisce un output diverso da LAStools. lidRfa lo stesso che in LAStoolsrealtà.

library(e1071)
library(lidR)

LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las <- readLAS(LASfile, filter = "-drop_z_below 1.3")

# e1071
skewness(las$Z) # -0.42 kurtosis(las$Z) # -0.66

# lidR
cloud_metrics(las, .stdmetrics_z)[c("zskew", "zkurt")]
# -0.42
# 2.33

# LAStools
system("lascanopy.exe -i Megaplot.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o output.csv")
# -0.42
# 2.33

Nella lidRcurtosi è definita secondo le formule di wikipedia . Possiamo immaginare che LAStoolsfaccia lo stesso. Nel lidRcodice c'è:

n * sum((z - zmean)^4)/(sum((z - zmean)^2)^2)

Nel e1071codice c'è:

# Here the same formula
r <- n * sum((x-xmean)^4)/(sum((x-xmean)^2)^2)

# Then why output is different
y <- if (type == 1) 
  r - 3
else if (type == 2)
  ((n + 1) * (r - 3) + 6) * (n - 1)/((n - 2) * (n - 3))
else 
  r * (1 - 1/n)^2 - 3

return(y)

Secondo la pagina di wikipedia, sembra corrisponda all'eccesso di curtosi o qualcosa del genere.