Risultati diversi nelle metriche calcolate con LAStools e lidR
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
Per quanto riguarda il numero di voxel, ciò può essere spiegato dall'allineamento dei voxel. lidR
centra il voxel a res/2
significare 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é lidR
fornisce un output diverso da LAStools
ma perché e1071
fornisce un output diverso da LAStools
. lidR
fa lo stesso che in LAStools
realtà.
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 lidR
curtosi è definita secondo le formule di wikipedia . Possiamo immaginare che LAStools
faccia lo stesso. Nel lidR
codice c'è:
n * sum((z - zmean)^4)/(sum((z - zmean)^2)^2)
Nel e1071
codice 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.