Estimating Forest Parameters

FOR 372

Elliot Shannon

2025-03-27

Consider an 8 acre stand of Douglas Fir in Washington state.

3 steps for generating estimates from sampling units.

  1. sample observation locations

  2. select measurement trees around each location

    • plot sampling
    • point sampling
  3. expand tree measurements to the desired per unit area basis and summarize to represent one observation within the sample

We randomly sample 5 observation locations.

In plot sampling, we specify a plot radius and measure all trees within the plot. These are 1/10th acre plots (radius = 37.2 ft).

Plot 4 does not have any measurement trees, but we will retain it as part of the sample.

Notice how we include a row for plot_id == 4.

# A tibble: 27 × 5
   plot_id tree_count species               DBH_in vol_cu_ft
     <dbl>      <dbl> <chr>                  <dbl>     <dbl>
 1       1          1 Pseudotsuga menziesii   63.0     867. 
 2       1          1 Pseudotsuga menziesii   34.8     265. 
 3       1          1 Pseudotsuga menziesii   70.4    1082. 
 4       1          1 Pseudotsuga menziesii   41.5     376. 
 5       1          1 Pseudotsuga menziesii   49.3     530. 
 6       2          1 Pseudotsuga menziesii   50.8     563. 
 7       2          1 Pseudotsuga menziesii   37.8     312. 
 8       2          1 Pseudotsuga menziesii   34.9     266. 
 9       2          1 Pseudotsuga menziesii   27.9     169. 
10       2          1 Pseudotsuga menziesii   44.5     432. 
11       3          1 Pseudotsuga menziesii   51.0     568. 
12       3          1 Pseudotsuga menziesii   81.1    1436. 
13       3          1 Pseudotsuga menziesii   44.1     425. 
14       3          1 Pseudotsuga menziesii   76.5    1278. 
15       3          1 Pseudotsuga menziesii   79.1    1365. 
16       3          1 Pseudotsuga menziesii   41.7     380. 
17       3          1 Pseudotsuga menziesii   45.4     450. 
18       3          1 Pseudotsuga menziesii   67.6     998. 
19       3          1 Pseudotsuga menziesii   18.4      73.5
20       4          0 <NA>                     0         0  
21       5          1 Pseudotsuga menziesii   25.9     146. 
22       5          1 Pseudotsuga menziesii   80.0    1397. 
23       5          1 Pseudotsuga menziesii   30.4     201. 
24       5          1 Pseudotsuga menziesii   48.4     512. 
25       5          1 Pseudotsuga menziesii   22.8     113. 
26       5          1 Pseudotsuga menziesii   36.0     282. 
27       5          1 Pseudotsuga menziesii   73.2    1169. 

Next we need to expand these measurements to a per unit area (per acre) basis. This is done using a tree factor.

In plot sampling, since plot locations are random, trees have equal probability of selection. This means each tree has the same tree factor.

\[TF = \frac{\text{unit area}}{\text{plot area}} = \frac{1 \text{ acre}}{0.1 \text{ acre}} = \frac{43560 \text{ ft}^2}{4356 \text{ ft}^2} = 10\]

# Tree factor is the same for all trees in plot sampling
TF = 1/0.1

# Generate expanded trees_ac, ba_ac, and vol_ac
df <- df %>% mutate(ba_sq_ft = 0.005454 * DBH_in^2,
                    trees_ac = tree_count * TF,
                    ba_ac = TF * tree_count * ba_sq_ft,
                    vol_ac = TF * tree_count * vol_cu_ft)

print(df)
# A tibble: 27 × 9
   plot_id tree_count species    DBH_in vol_cu_ft ba_sq_ft trees_ac ba_ac vol_ac
     <dbl>      <dbl> <chr>       <dbl>     <dbl>    <dbl>    <dbl> <dbl>  <dbl>
 1       1          1 Pseudotsu…   63.0      867.    21.7        10 217.   8673.
 2       1          1 Pseudotsu…   34.8      265.     6.62       10  66.2  2650.
 3       1          1 Pseudotsu…   70.4     1082.    27.1        10 271.  10822.
 4       1          1 Pseudotsu…   41.5      376.     9.40       10  94.0  3761 
 5       1          1 Pseudotsu…   49.3      530.    13.3        10 133.   5300.
 6       2          1 Pseudotsu…   50.8      563.    14.1        10 141.   5632.
 7       2          1 Pseudotsu…   37.8      312.     7.80       10  78.0  3120.
 8       2          1 Pseudotsu…   34.9      266.     6.66       10  66.6  2663.
 9       2          1 Pseudotsu…   27.9      169.     4.24       10  42.4  1695.
10       2          1 Pseudotsu…   44.5      432.    10.8        10 108.   4322.
# ℹ 17 more rows

To get plot-level estimates, we can sum expanded values by plot.

# plot’s per unit area estimate is 
# the sum of its per unit area tree measurements
plot_summary <- df %>% group_by(plot_id) %>%
  summarize(trees_ac = sum(trees_ac),
            ba_ac = sum(ba_ac),
            vol_ac = sum(vol_ac))

print(plot_summary)
# A tibble: 5 × 4
  plot_id trees_ac ba_ac vol_ac
    <dbl>    <dbl> <dbl>  <dbl>
1       1       50  780. 31206.
2       2       50  436. 17433 
3       3       90 1744. 69745.
4       4        0    0      0 
5       5       70  955. 38210.

Tree measurements (basal area ft2)

Expanded tree measurements (basal area ft2/ac)

Plot level summaries (basal area ft2/ac)

We now have 5 samples from which we can estimate stand level forest parameters.

alpha <- 0.05
t <- qt(p = 1 - alpha / 2, df = n_samps - 1)

stand_summary <- plot_summary %>% 
  summarize(mean_trees_ac = mean(trees_ac),     
            mean_ba_ac = mean(ba_ac),             
            mean_vol_ac = mean(vol_ac),             
            se_trees_ac = sd(trees_ac)/sqrt(n()),   
            se_ba_ac = sd(ba_ac)/sqrt(n()),         
            se_vol_ac = sd(vol_ac)/sqrt(n()),      
            lower_trees_ac = mean_trees_ac - t * se_trees_ac,
            upper_trees_ac = mean_trees_ac + t * se_trees_ac,
            lower_ba_ac = mean_ba_ac - t * se_ba_ac,
            upper_ba_ac = mean_ba_ac + t * se_ba_ac,
            lower_vol_ac = mean_vol_ac - t * se_vol_ac,
            upper_vol_ac = mean_vol_ac + t * se_vol_ac)

Stand level estimates (plot sampling)
Variable Mean SE Lower 95% CI Upper 95% CI Truth
Trees (per acre) 52 14.9 10.4 93.6 52.8
Basal area (ft2/ac) 782.9 290.3 -23.2 1,589.1 803.1
Volume (ft3/ac) 31,318.7 11,614.1 -927.3 63,564.8 32,125.8

In point sampling, the probability of each tree being included in the sample is a function of some characteristic. Here, we use DBH.

A forester uses a specialized tool to determine whether each tree around a sampling point is in or out.

Here, we use a sighting angle of 255.23 (min), yielding a basal area factor (BAF) of 60 ft2/ac.

Measurement trees selected using point sampling.

# A tibble: 58 × 5
   point_id tree_count species               DBH_in vol_cu_ft
   <fct>         <dbl> <chr>                  <dbl>     <dbl>
 1 1                 1 Pseudotsuga menziesii   48.7      518.
 2 1                 1 Pseudotsuga menziesii   63.0      867.
 3 1                 1 Pseudotsuga menziesii   59.4      770.
 4 1                 1 Pseudotsuga menziesii   34.8      265.
 5 1                 1 Pseudotsuga menziesii   70.4     1082.
 6 1                 1 Pseudotsuga menziesii   41.5      376.
 7 1                 1 Pseudotsuga menziesii   79.8     1388.
 8 1                 1 Pseudotsuga menziesii   73.8     1188.
 9 1                 1 Pseudotsuga menziesii   51.0      569.
10 1                 1 Pseudotsuga menziesii   55.1      663.
11 1                 1 Pseudotsuga menziesii   36.5      291.
12 1                 1 Pseudotsuga menziesii   49.3      530.
13 1                 1 Pseudotsuga menziesii   77.8     1322.
14 1                 1 Pseudotsuga menziesii   68.7     1028.
15 2                 1 Pseudotsuga menziesii   50.8      563.
16 2                 1 Pseudotsuga menziesii   37.8      312.
17 2                 1 Pseudotsuga menziesii   70.8     1095.
18 2                 1 Pseudotsuga menziesii   35.8      280.
19 2                 1 Pseudotsuga menziesii   65.8      946.
20 2                 1 Pseudotsuga menziesii   70.0     1068.
21 2                 1 Pseudotsuga menziesii   34.9      266.
22 2                 1 Pseudotsuga menziesii   77.0     1292.
23 2                 1 Pseudotsuga menziesii   58.4      744.
24 2                 1 Pseudotsuga menziesii   79.8     1388.
25 2                 1 Pseudotsuga menziesii   80.4     1411.
26 2                 1 Pseudotsuga menziesii   72.4     1143.
27 2                 1 Pseudotsuga menziesii   27.9      169.
28 2                 1 Pseudotsuga menziesii   62.4      849.
29 2                 1 Pseudotsuga menziesii   44.5      432.
30 2                 1 Pseudotsuga menziesii   83.8     1533.
31 2                 1 Pseudotsuga menziesii   83.8     1534.
32 3                 1 Pseudotsuga menziesii   51.0      568.
33 3                 1 Pseudotsuga menziesii   81.1     1436.
34 3                 1 Pseudotsuga menziesii   44.1      425.
35 3                 1 Pseudotsuga menziesii   76.5     1278.
36 3                 1 Pseudotsuga menziesii   74.2     1200.
37 3                 1 Pseudotsuga menziesii   51.8      586.
38 3                 1 Pseudotsuga menziesii   79.1     1365.
39 3                 1 Pseudotsuga menziesii   45.2      446.
40 3                 1 Pseudotsuga menziesii   41.7      380.
41 3                 1 Pseudotsuga menziesii   45.4      450.
42 3                 1 Pseudotsuga menziesii   67.6      998.
43 3                 1 Pseudotsuga menziesii   81.4     1444.
44 4                 1 Pseudotsuga menziesii   83.2     1511.
45 4                 1 Pseudotsuga menziesii   70.3     1077.
46 5                 1 Pseudotsuga menziesii   25.9      146.
47 5                 1 Pseudotsuga menziesii   61.1      815.
48 5                 1 Pseudotsuga menziesii   70.6     1088.
49 5                 1 Pseudotsuga menziesii   80.0     1397.
50 5                 1 Pseudotsuga menziesii   30.4      201.
51 5                 1 Pseudotsuga menziesii   48.4      512.
52 5                 1 Pseudotsuga menziesii   36.0      282.
53 5                 1 Pseudotsuga menziesii   73.2     1169.
54 5                 1 Pseudotsuga menziesii   83.6     1524.
55 5                 1 Pseudotsuga menziesii   52.4      600.
56 5                 1 Pseudotsuga menziesii   73.3     1172.
57 5                 1 Pseudotsuga menziesii   74.2     1200.
58 5                 1 Pseudotsuga menziesii   72.5     1146.

We again expand these measurements to a per unit area (per acre) basis using a tree factor.

In point sampling, the tree factor for each tree is different, and depends on the characteristic used to determine it’s inclusion in the sample (here, we use DBH).

The tree factor for tree \(j\) is calculated as

\[TF_j = \frac{\text{unit area}}{\text{inclusion zone area}_j}\]

where the \(\text{inclusion zone area}_j\) is calculated as

\[ \text{inclusion zone area}_j = \pi \left(\frac{\text{DBH (in)}}{12k} \right)^2\] A sighting angle of 255.23 (min) corresponds to \(k \approx 0.07423\).

So the tree factor for tree \(j\) can be calculated as

\[TF_j = \frac{\text{unit area}}{\text{inclusion zone area}_j} = \frac{43560 \text{ ft}^2}{\pi \left(\frac{\text{DBH (in)}}{12k} \right)^2}\]

k <- 0.07423
# Generate expanded trees_ac, ba_ac, and vol_ac
df <- df %>% mutate(TF = 43560 / (pi * (DBH_in / (12 * k))^2),
                    ba_sq_ft = 0.005454 * DBH_in^2,
                    trees_ac = tree_count * TF,
                    ba_ac = tree_count * TF * ba_sq_ft,
                    vol_ac = tree_count * TF * vol_cu_ft)
# A tibble: 58 × 10
   point_id tree_count species    DBH_in vol_cu_ft    TF ba_sq_ft trees_ac ba_ac
   <fct>         <dbl> <chr>       <dbl>     <dbl> <dbl>    <dbl>    <dbl> <dbl>
 1 1                 1 P. menzie…   48.7      518.  4.63    12.9      4.63  60.0
 2 1                 1 P. menzie…   63.0      867.  2.77    21.7      2.77  60.0
 3 1                 1 P. menzie…   59.4      770.  3.12    19.3      3.12  60.0
 4 1                 1 P. menzie…   34.8      265.  9.06     6.62     9.06  60.0
 5 1                 1 P. menzie…   70.4     1082.  2.22    27.1      2.22  60.0
 6 1                 1 P. menzie…   41.5      376.  6.38     9.40     6.38  60.0
 7 1                 1 P. menzie…   79.8     1388.  1.73    34.7      1.73  60.0
 8 1                 1 P. menzie…   73.8     1188.  2.02    29.7      2.02  60.0
 9 1                 1 P. menzie…   51.0      569.  4.22    14.2      4.22  60.0
10 1                 1 P. menzie…   55.1      663.  3.62    16.6      3.62  60.0
# ℹ 48 more rows
# ℹ 1 more variable: vol_ac <dbl>

A sighting angle of 255.23 (min) corresponds to a basal area factor (BAF) of 60. This means each measured tree represents a basal area of 60 ft2/ac. We can see this in df, where the ba_ac for each tree is 60.00322 (reflecting some rounding error).

df %>% pull(ba_ac)
 [1] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
 [9] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
[17] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
[25] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
[33] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
[41] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
[49] 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322 60.00322
[57] 60.00322 60.00322

To get point-level estimates, we can sum expanded values by plot.

# point’s per unit area estimate is 
# the sum of its per unit area tree measurements
point_summary <- df %>% group_by(point_id) %>%
  summarize(trees_ac = sum(trees_ac),
            ba_ac = sum(ba_ac),
            vol_ac = sum(vol_ac))

print(point_summary)
# A tibble: 5 × 4
  point_id trees_ac ba_ac vol_ac
  <fct>       <dbl> <dbl>  <dbl>
1 1           56.7   840. 33603.
2 2           72.8  1020. 40803.
3 3           42.4   720. 28802.
4 4            3.82  120.  4800.
5 5           62.2   780. 31203.

Tree measurements (basal area ft2)

Expanded tree measurements (basal area ft2/ac)

Point level summaries (basal area ft2/ac)

We now have 5 samples from which we can estimate stand level forest parameters.

alpha <- 0.05
t <- qt(p = 1 - alpha / 2, df = n_samps - 1)

stand_summary <- point_summary %>% 
  summarize(mean_trees_ac = mean(trees_ac),     
            mean_ba_ac = mean(ba_ac),             
            mean_vol_ac = mean(vol_ac),             
            se_trees_ac = sd(trees_ac)/sqrt(n()),   
            se_ba_ac = sd(ba_ac)/sqrt(n()),         
            se_vol_ac = sd(vol_ac)/sqrt(n()),      
            lower_trees_ac = mean_trees_ac - t * se_trees_ac,
            upper_trees_ac = mean_trees_ac + t * se_trees_ac,
            lower_ba_ac = mean_ba_ac - t * se_ba_ac,
            upper_ba_ac = mean_ba_ac + t * se_ba_ac,
            lower_vol_ac = mean_vol_ac - t * se_vol_ac,
            upper_vol_ac = mean_vol_ac + t * se_vol_ac)

Stand level estimates (point sampling)
Variable Mean SE Lower 95% CI Upper 95% CI Truth
Trees (per acre) 47.6 12.0 14.3 80.9 52.8
Basal area (ft2/ac) 696.0 152.5 272.6 1,119.5 803.1
Volume (ft3/ac) 27,842.4 6,100.5 10,904.7 44,780.0 32,125.8