Podernovo, Consuma, 2017 (la Marca, Rinaldini, et al.)
Nel corso di una utilizzazione a raso di un impianto di douglasia di circa 50 anni, in un area di 2500 m2, tra 87 fusti presenti, ne sono stati selezionati 47 come Alberi Modello.
Dagli AM abbattuti, alle estremità dei toppi individuati dall’operatore in funzione degli assortimenti da produrre, sono state prelevate sezioni (rotelle).
[Project repository: https://github.com/NuoroForestrySchool/TreeStemAnalysis/tree/master/2017Douglasia-Podernovo]

[Documentazione struttura base dati: https://docs.google.com/a/uniss.it/document/d/1XvKwF-WxBra7PZ-ooxAcUGMu0ZsKfqYpiE0zPzzQw08/edit?usp=sharing]

Analisi preliminare di completezza e congruenza dei rilievi effettuati

Base dati

##  path:  2017Douglasia-Podernovo 
##  file:  2017PodernovoDouglasiaProfiliSemplificati_GSapp.sqlite

Elenco tabelle contenute nel Data Base

##  [1] "AdF0"                "Aree"                "CalcolaIncRaggio"   
##  [4] "Cavallettamento"     "ClassificaRighe"     "FustiAM"            
##  [7] "FustiAM_eta"         "IncHtot"             "Rilievi"            
## [10] "RilieviAccoppiati"   "Rotelle"             "SintesiRotelleDaAdF"
## [13] "tmp"

Consistenza della base dati

##             Table Nrows
## 1            Aree     1
## 2         Rilievi     2
## 3 Cavallettamento    50
## 4         FustiAM    46
## 5         IncHtot   185
## 6         Rotelle   191
## 7            AdF0 12509

Fusti modello con altezza totale non nota

##          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## Id_fusto "4"  "5"  "9"  "18" "19" "24" "29" "33"

Fusti modello a cui manca la rotella di base

##          [,1] [,2]
## Id_fusto "35" "6"

Fusti modello, dati di base [ATTENZIONE: Fusti con anno di nascita recente da verificare]

SELECT * FROM FustiAM_eta ORDER BY anno_n DESC
Displaying records 1 - 10
CodiceArea CodiceRilievo Id_fusto d130 h_tot h_tot_note anno_n eta_abb
P a 27 21 25 1990 27
P a 17 19 36 1984 33
P a 41 26 23 1982 35
P a 32 23 28 1980 37
P a 21 28 22 1976 41
P a 22 29 28 1976 41
P a 25 36 35 1973 44
P a 38 46 37 1973 44
P a 44 27 23 1973 44
P a 42 17 13 1971 46

Altezza delle rotelle (dei fusti con h_tot nota e rotella di base disponibile)

##  Id_fusto 1    2     3     4     5     6    7
##         1 0 6.25  12.5 18.75  20.2           
##         2 0  6.3  12.6  18.9  25.2 28.35     
##         3 0  6.3  12.6  18.9  25.2 27.65     
##         7 0  6.3  12.6  18.9  25.2  27.6     
##        10 0  6.3  12.6  18.9  25.2 31.45     
##        11 0    5    10                       
##        12 0  6.3  12.6  17.6                 
##        13 0  6.3  12.6  18.9  23.9           
##        14 0  6.3  12.6  18.9  25.2           
##        16 0  6.3  12.6  18.9                 
##        17 0    5    10                       
##        20 0 12.5    25                       
##        21 0  6.3                             
##        22 0 12.5                             
##        25 0 12.5  18.9                       
##        26 0 12.5    25                       
##        27 0 2.45     5                       
##        30 0 12.6    25                       
##        32 0 2.45   4.9  7.35   9.9 12.35 14.9
##        36 0 12.6 21.35  23.8 26.25           
##        37 0 12.5  18.9  25.2                 
##        38 0  6.3  12.6  18.9  25.2  27.6     
##        39 0 12.5 14.95  17.4                 
##        40 0  6.3  12.6  18.9  25.2           
##        41 0   11                             
##        42 0  6.3                             
##        43 0 13.5                             
##        44 0  6.3  8.75  11.2 13.65           
##        46 0  6.3  12.6  18.9  25.2

Rotelle con ‘ripetizione=b’ diversa da ‘a’ (occorre verificare i casi in cui la ‘diff’ è negativa e comunque quando la nota è vuota)

SELECT A.Id_fusto,
       A.Id_rotella,
       A.num_inc num_inc_a,
       B.num_inc num_inc_b,
       A.num_inc - B.num_inc diff,
       B.note
  FROM SintesiRotelleDaAdF A
       LEFT JOIN
       SintesiRotelleDaAdF B USING (
           Id_fusto,
           Id_rotella
       )
 WHERE A.ripetizione = 'a' AND 
       B.ripetizione = 'b' AND 
       num_inc_a <> num_inc_b;
46 records
Id_fusto Id_rotella num_inc_a num_inc_b diff note
2 1 50 37 13 mancano misure successive
3 1 50 47 3 mancano misure successive
4 1 50 30 20 mancano misure successive
4 3 28 29 -1 NA
4 4 19 14 5 mancano misure successive
7 1 51 31 20 mancano misure successive
7 4 30 6 24 mancano misure successive
8 1 43 44 -1 NA
9 1 51 40 11 mancano misure successive
9 2 42 39 3 mancano misure successive
9 5 23 19 4 mancano misure successive
10 1 49 40 9 mancano misure successive
11 2 38 26 12 mancano misure successive
13 1 50 35 15 mancano misure successive
15 5 19 20 -1 NA
15 6 14 13 1 NA
16 1 49 37 12 mancano misure successive
16 2 40 27 13 mancano misure successive
18 1 50 46 4 mancano misure successive
23 1 49 35 14 mancano misure successive
23 2 36 37 -1 NA
23 4 19 20 -1 NA
24 1 36 17 19 mancano misure successive
26 2 36 6 30 mancano misure successive
27 1 28 1 27 mancano misure successive
28 2 33 36 -3 NA
28 4 35 30 5 NA
28 5 35 31 4 NA
28 6 31 28 3 NA
29 1 47 48 -1 NA
29 2 40 39 1 NA
30 1 50 39 11 mancano misure successive
31 1 51 45 6 mancano misure successive
31 2 38 37 1 NA
31 4 19 20 -1 NA
33 4 32 7 25 mancano misure successive
34 1 50 42 8 mancano misure successive
34 3 31 32 -1 NA
35 2 39 32 7 mancano misure successive
36 2 43 16 27 mancano misure successive
38 1 45 31 14 mancano misure successive
40 1 51 47 4 mancano misure successive
40 4 28 27 1 NA
44 1 45 22 23 mancano misure successive
45 1 42 43 -1 NA
46 5 17 15 2 mancano misure successive

Dettaglio da sopra, raggi con letture in eccesso: arrivano al 2018!

select distinct Id_fusto, Id_rotella, ripetizione, max(anno) from AdF0 group by Id_fusto, Id_rotella, ripetizione having anno>2017;
Displaying records 1 - 10
Id_fusto Id_rotella ripetizione max(anno)
4 3 b 2018
8 1 b 2018
15 5 b 2018
23 2 b 2018
23 4 b 2018
28 2 b 2020
29 1 b 2018
31 4 b 2018
34 3 b 2018
45 1 b 2018

Misure con incongruenze evidenti (ho ipotizzato delle correzioni, sarebbe bene, verificare sulle rotelle: ‘misura0’ dovrebbe essere la tua misura, ‘misura1’ è il valore modificato da me)

print(dbGetQuery(con, "select Id_fusto, Id_rotella, ripetizione, anno, misura0, misura1 from AdF0 where misura1<>misura0"))
##    Id_fusto Id_rotella ripetizione anno misura0 misura1
## 1         1          1           b 2001    38.5   38.30
## 2         1          1           b 2002    38.3   38.50
## 3         3          1           a 1988   114.9   14.90
## 4         3          1           b 2009     5.8   55.80
## 5         6          4           a 1994     1.1   11.10
## 6         6          5           b 2015    18.6   18.40
## 7         6          5           b 2016    18.4   18.60
## 8         7          2           b 2012     9.8   39.80
## 9         7          3           b 2002    30.6   30.40
## 10        7          3           b 2003    30.4   30.60
## 11       12          3           b 2013    19.4   19.90
## 12       15          6           a 2010      46    4.60
## 13       18          1           b 2010     444   44.40
## 14       21          1           b 1979     1.4   17.40
## 15       21          2           b 1989    14.5   13.40
## 16       21          2           b 1990    13.4   14.30
## 17       21          2           b 1991    14.3   14.50
## 18       23          2           b 1984       2   22.00
## 19       23          2           b 2009    36.1   37.10
## 20       28          6           a 1998     3.1    3.15
## 21       30          1           b 2000    33.6   32.60
## 22       31          3           a 2016     0.8    0.70
## 23       31          3           a 2015     0.7    0.80
## 24       32          5           a 1996     6.2    6.00
## 25       32          5           a 1995       6    6.20
## 26       37          1           a 1979      20   19.00
## 27       37          3           a 1991    16.6   15.60
## 28       37          4           b 2016    31.3   32.30
## 29       40          2           b 2006    41.4   41.20
## 30       40          2           b 2007    41.8   41.40
## 31       40          2           b 2008    41.2   41.60
## 32       40          4           b 2004    29.1   28.70
## 33       40          4           b 2005    28.7   29.10
## 34       40          4           b 2006    29.1   29.60
## 35       40          4           b 2007    29.6   30.00
## 36       40          4           b 2008      30   30.40
## 37       40          4           b 2009    30.4   30.80
## 38       40          4           b 2010    30.8   31.20
## 39       40          4           b 2011    31.2   31.80
## 40       40          4           b 2012    31.8   32.20
## 41       40          4           b 2013    32.2   32.50
## 42       40          4           b 2014    32.5   33.10
## 43       40          4           b 2015    33.1   33.50
## 44       40          4           b 2016    33.5   33.90
## 45       43          1           b 1989      24   24.60
## 46       43          1           b 1996     2.5   25.50

Analisi incrementi estremi (“le variazioni annuali di incremento sono tra loro sincronizzate?
Proviamo a vedere come sono distribuiti nel campione gli incrementi massimi.”)

Livello e variabilità degli incrementi massimi

irmax <- dbGetQuery(con,"select Id_fusto, Id_rotella, ripetizione, anno, max(ir) max_ir from CalcolaIncRaggio group by Id_fusto, Id_rotella, ripetizione")
library(latticeExtra, quietly=T)
## Warning: package 'latticeExtra' was built under R version 3.3.3
with(irmax[irmax$ripetizione=='a',], histogram(anno, breaks=max(anno)-min(anno)+1, type="c"))

library(beanplot, quietly=T)
## Warning: package 'beanplot' was built under R version 3.3.3
with(irmax[irmax$ripetizione=='a',], beanplot(max_ir  ~ anno, main="Media e distribuzione dei valori di Incremento-Massimo", sub="solo ripetizione 'a', Fusti e Rotelle confusi"))

OSSERVAZIONE: i due istogrammi (relativi a ‘ripetizione’ ‘a’, sopra, e ‘b’, sotto) non appaiono molto correlati, evito quindi, per ora di confondere le ripetizioni!

with(irmax[irmax$ripetizione=='b',], histogram(anno, breaks=max(anno)-min(anno)+1, type="c"))

ATTENZIONE: si osserva inoltre una anomala concentrazione di picchi di incremento sull’ultima misura effettuata sulle rotelle

select ripetizione, anno, count() freq from (select Id_fusto, Id_rotella, ripetizione, anno, max(ir) from CalcolaIncRaggio group by Id_fusto, Id_rotella, ripetizione) group by ripetizione, anno having anno>=2010 and ripetizione='b'
3 records
ripetizione anno freq
b 2010 1
b 2017 38
b 2018 3

Vista di insieme su tutti gli incrementi - solo ripetizione=‘a’

ir <- dbReadTable(con, "CalcolaIncRaggio")
library(latticeExtra, quietly=T)
with(ir[ir$ripetizione=='a' & ir$Id_fusto<99,], xyplot(ir~anno|as.factor(Id_fusto), group=as.factor(Id_rotella), type="l"))