Unterschiedliche Ergebnisse bei Metriken, die mit LAStools und lidR berechnet wurden
Ich habe ein Baldachinhöhenmodell, das aus TLS-Daten mit hoher Dichte auf einem 60 x 200 Meter großen Grundstück berechnet wurde. Ich habe versucht, Voxel mit LAStools und lidR zu berechnen und habe signifikant unterschiedliche Ergebnisse erzielt. Ich habe mich gefragt, ob jemand klarstellen kann, was passiert. Lastools-Skript, das ich verwendet habe:
lasvoxel -i infile.laz -drop_class 2 -step 0.5 -o outfile.las
number of voxels: 189077
lidR-Code:
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
Auch berechnete Schiefe und Kurtosis der Baldachinhöhe: LAStools:
lascanopy -i infiles\*.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o outfile.csv
Ergebnis:
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))
})
Ergebnis:
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
Wie wir sehen können, sind die Ergebnisse für die Schiefe gleich, aber die Kurtosis-Werte sind sehr unterschiedlich. Kann mir bitte jemand helfen zu verstehen, warum es so einen großen Unterschied gibt?
Antworten
In Bezug auf die Anzahl der Voxel kann dies durch die Ausrichtung der Voxel erklärt werden. lidR
zentriert das Voxel auf, res/2
was bedeutet, dass der Boden des gemahlenen Voxels bei 0 und nicht in der Mitte liegt. Wenn in LAStools Voxel auf 0 zentriert sind, kann die Verschiebung den Unterschied erklären. Ich habe nicht versucht, sicher zu sein, aber das macht Sinn.
Über Schiefe und Kurtosis ist Ihre Frage schlecht gestellt. Sie fragen nicht, warum lidR
eine andere Ausgabe als bereitgestellt wird, LAStools
sondern warum e1071
eine andere Ausgabe als bereitgestellt wird LAStools
. lidR
macht das gleiche als LAStools
eigentlich.
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
In lidR
der Kurtosis wird nach Wikipedia-Formeln definiert . Wir können uns vorstellen, dass LAStools
dies auch so ist. Im lidR
Code ist:
n * sum((z - zmean)^4)/(sum((z - zmean)^2)^2)
Im e1071
Code ist:
# 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)
Laut Wikipedia-Seite scheint es der übermäßigen Kurtosis oder so etwas zu entsprechen.