FOR 372
2025-03-27
Consider an 8 acre stand of Douglas Fir in Washington state.
3 steps for generating estimates from sampling units.
sample observation locations
select measurement trees around each location
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)
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}\]
# 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).
[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)
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 |