Différents résultats dans les métriques calculées avec LAStools et lidR

Aug 15 2020

J'ai un modèle de hauteur de la canopée calculé à partir de données TLS haute densité sur une parcelle de 60 mètres sur 200. J'ai essayé de calculer les voxels avec LAStools et lidR et j'ai obtenu des résultats très différents. Je me demandais si quelqu'un pouvait expliquer clairement ce qui se passe. Script Lastools que j'ai utilisé:

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

number of voxels: 189077 

Code 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 

L'asymétrie et l'aplatissement de la hauteur de la voilure ont également été calculés: LAStools:

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

Résultat:

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

Résultat:

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

Comme nous pouvons le voir, les résultats pour l'asymétrie sont les mêmes, mais les valeurs de kurtosis sont très différentes. Quelqu'un peut-il m'aider s'il vous plaît à comprendre pourquoi il y a une si grande différence?

Réponses

3 JRR Aug 15 2020 at 19:34

Concernant le nombre de voxels cela peut s'expliquer par l'alignement des voxels. lidRcentre le voxel en res/2signifiant que le bas du voxel au sol est à 0 et non au centre. Si LAStools a des voxels centrés sur 0, le décalage peut expliquer la différence. Je n'ai pas essayé d'en être sûr mais cela a du sens.

À propos de l'asymétrie et du kurtosis, votre question est mal posée. Vous ne demandez pas pourquoi lidRfournit une sortie différente de LAStoolsmais pourquoi e1071fournit une sortie différente de LAStools. lidRfait la même chose qu'en LAStoolsréalité.

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

Dans lidRle kurtosis est défini selon les formules de wikipedia . On peut deviner que cela LAStoolsfait la même chose. Dans lidRle code est:

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

Dans e1071le code est:

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

Selon la page wikipedia, il semble que cela corresponde à l' excès de kurtosis ou quelque chose comme ça.