Giter VIP home page Giter VIP logo

Comments (17)

trotsiuk avatar trotsiuk commented on August 29, 2024

Hi @Rasilgon,

I was not developing 3-PG itself, but rather translated the code. So I can still have a limited understanding of all the processed.

For such type of questions, I would suggest to ask also @DavidForrester for advise. David, would you have some suggestions?

But quickly, height is simply calculated from the biomass. The only variables simulated are NPP > biomass. And all the others (dbh, heigh, volume, etc..) are derived based on equations.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Thanks for replying @trotsiuk !
Yes, the question might be more related to the model and parameters, than to the package.

Biomass (biomass_stem) also displays very high values for Beech (2500 tDM ha, 2.5 x more than oak and pine). It is easier for me to use height to visualize how growth decline works, but if height is derived from biomass, I might be seeing the effects of the height equation as well. This would also apply to DBH. In the previous plot, Pine reaches more than 200 cm DBH in less than 100 year, which might be too much. Obviously, there are other parameters influencing these results, starting with fertility.

I had a look at the growth modifiers, and the age modifier (f_age) is very high for all species (actually not lower than 0.99). From this I understand that by the end of the run, when trees are almost 100 years old, there is negligible growth decline. However, oak and pine do show a decline in height growth. This would indicate that something else than age limits height growth for these species. This limitation(s) would not affect beech, and since f_age is almost 1, no decline is noticeable.

All publications from 3PG use the same values of rAge and nAge (or very similar values) but different maxAge values. I had a closer look at how maxAge influence in f_Age and wrote an f_age function to display how different maxAges but same rAge and nAge affect f_age values.

ageDecline <- function(age){
  f_age <- 1 / (1 + ((age/maxAge)/rAge)^nAge)
  return(f_age)
}

And if I run it with different maxAge values at different ages

maxAgeValues <- c(50, 100, seq(150, 750, by = 100))
ageValues <- seq(50, 300, by = 50)
col.age <- RColorBrewer::brewer.pal(length(maxAgeValues), name = "Spectral")

# Default parameters
rAge <- 0.95
nAge <- 4

for (i in 1:length(maxAgeValues)){
  maxAge <- maxAgeValues[i]
  if(i == 1){
    plot(ageValues, sapply(ageValues,FUN = ageDecline),
         type = "b", ylim = c(0, 1), xlim = range(ageValues), col = col.age[i],
         ylab = "f_age value (0-1)",  xlab = "age",
         main = paste("rAge =", rAge,  "nAge =", nAge))
  }else{
    lines(ageValues, sapply(ageValues,FUN = ageDecline), col = col.age[i])
  }
}

legend("bottomleft",  legend = maxAgeValues, col= col.age, title = "maxAge",
       lty = 1, lwd = 2, bg=NA)

I obtain this (below). If default parameters are used, there is almost no decline for species with great maxAge. Increasing maxAge does not only delay the decline, but it also changes its behaviour. Assuming that my reasoning is correct so far, I figure that for short model runs this is not an issue, but in longer ones ( > 50 y), could lead to outputs like the one I obtained for beech, if no other modifier or competition limits strongly growth.

image

If this is right, I could deal with the issue by using different maxAge and rAge values. The default nAge (nAge=4) would seem appropiate.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Hi @trotsiuk, Hi @DavidForrester,

I am still trying to understand why some output values are so high, when running the model as I did, and how to deal with the model to avoid such outputs.

As you pointed out, forestry variables are derived from biomass. Thus, I have been also looking a biomass, which also returns very high values per ha, like ca. 25000 tDN /ha for beech monoculture or more 1000 tDN/ha for pine.

image

I think that the very high biomass is related to self-thinning rule. When the number of stems is smaller than 1000, the biom_tree_max can very high, regardless of the biom_stem per ha value, as I understood from the publications and the code.

This issue seems to show up in runs without thinning plan, and it is also dependent on the initial stem density. I am not sure if this is a bug, or just the limits of the model or wrong parameters for such simulation. In any case, I would expect mortality to limit the total number of stems, considering the total biomass in some way.

I hope this feedback is helpful!
Thanks!!

from r3pg.

DavidForrester avatar DavidForrester commented on August 29, 2024

Sorry for the delay in responding. We are currently moving back to Australia, which has been a lot of work!

Regarding the upper graphs, one issue is that the height parameters are inappropriate for this forest. That is, we know that if the diameter of beech is 200 cm, its height is still only going to be up to about 40 m (and perhaps not even that), and certainly not 100 m. There is also a problem with the height shown in the second illustration above (where heights are also reaching 100 m). If the height is over predicted to such a large extent, it will also influence the volume calculations when volume is calculated using height and diameter as opposed to the other option of using stem biomass and wood density. As Vova said, height, volume etc are basically predicted from stand stem biomass and tree density. If these are incorrect, then everything else will be incorrect. However, given that your diameter predictions look plausible (but at the high end), it looks like a more likely problem is that the allometric height parameters are not appropriate for this simulation (e.g. the trees used to develop the parameters might have been much smaller than the trees being simulated).

My understanding is that the age-related decline in 3-PG is designed for the late part of the age-related decline that is not accounted for in other parts of model (e.g. in relation to SLA, wood density, litterfall etc). This type of age-related decline effect probably does not happen in beech, pine, oak forests until they are well over 200 years old (i.e. outside the illustrated simulation length). I realise that some studies tune the age-related decline parameters to cause early decline in growth, but I don’t think that is appropriate, and often the growth should start to decline much earlier (after the peak LAI is reached) due to age-related changes in SLA, litterfall, wood density etc. This will also explain why the apparent age-related declines appear to be different for each species – it is because most of the apparent age-related decline is not caused by those parameters (MaxAge, nAge, rAge) until the stands become very old, but instead it is caused by differences in SLA, litterfall etc parameters.

As you suggest, the decline in height with increasing age is unexpected. There are several reasons why it could decline. One is that some thinning is done from above (or there is size- or age-related mortality that kills larger older trees), which removes the larger trees and thereby reduces the mean height, but this is clearly not the cause in this case. Another reason that is more plausible, is that if height is predicted not only from diameter, but from stand basal area (nHC parameter), then if the stand basal area increases, its negative effects on height might be even greater than the positive effect of diameter. This may not happen in reality, but it could happen in the model if the allometric height parameters are being used outside of the range where they were developed. That is, there would be relatively few forests in Europe, I guess, where the mean (not maximum) diameter is > 50 cm, but this diameter is already reached in the first half of your simulations. This means that there is something (e.g. fertility rating, climate etc) that is allowing higher growth rates than usual, and this also enables your simulated stands to quickly reach the limits of stand structures where we actually have data to calculate the parameters – if we want to develop parameter sets that work for stands with very large trees (e.g. mean diameter > 60 cm), which would be great to do, but we would have a lot of trouble finding data from a range of site types and regions.

The self-thinning is an issue that might not quite be resolved in relation to 3-PG. We discussed this a bit in the discussion section of https://link.springer.com/article/10.1007/s10342-021-01370-3. The self-thinning parameters maintain a sort of boundary for the stand density. Problems might occur when the simulated stand grows faster than it would in reality, which would mean that the stand density boundary is reached early and that upper stand density is maintained while the number of trees quickly declines and the mean tree size quickly increases. This will cause a problem that you noted where the mean tree size is much too high and that then causes problems for all variables calculated from tree size (e.g. height, crown sizes, volume etc).

I hope this helps. Let me know if something is unclear or if I have missed something.

from r3pg.

DavidForrester avatar DavidForrester commented on August 29, 2024

I forgot to mention in my previous comment, that a solution could be to fit the height equations again, but check that they predict plausible heights for very large trees, and if not, fit the equations in a way that forces this. Possibly also check that if the height equations contain the competition variable, the competition values used to develop the equations include the range of competition values being simulated.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Hi @DavidForrester ! Thanks for replying! International Moving + pandemic sound like a great logistic challenge :)

We are using the parameters from https://link.springer.com/article/10.1007/s10342-021-01370-3 and the corresponding settings.. Fertility is set to max, so 1, and climate is a replicate, every year the same, based on average climate from CORDEX for the next 100 years for a german location nearby the Rhein in BW. In this case, we ran monocultures starting at 2 years olds (2006) until 2099, so the trees are 95 years old by the end of the simulation. Being naive, we expected some extremes outputs of the model, but not that much.

From your explanation, I understand that dbh and height parameters should be tuned or re-calibrated if we aim to run the model in such conditions (long runs). As you pointed out, I guess that one objective could be to set as reference data for this calibration the max. height and dbh that the different species can reach. If no data is available, empirical equations from yield tables could be used to generate this data. I am not sure how fine such tuning can be, but it might help to better fit the height and dbh parameters.

As you also commented, the model is sensitive to stand density. High initial densities and the self-thinning mortality can also lead to such unrealistic values. And as I understood it now, we should be very cautious with fertility, because very fast growth might challenge the model.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Concerning the growth modifier (f_age), I though that it represented the growth decline with age. I was not aware the age-dependent growth decline was implemented in other functions of the model. Thus, the parameters tgammaF, tSLA, tBB and other related to these describe also age decline. However, when I look at the parameter DB I see very little difference among publication, despite the great differences in Max Age. This is not my area of expertise, so I am not that familiar with age decline process in trees/plants.

I expanded the graph of f_age (see below) to include the entire age range for species such beech, pine and oak. From your explanation, I understand that the idea behind f_age is not set a hard limit to the forestry variables (dbh, height) but to describe the decrease of efficiency in absorption of photosynthetically active radiation with age, right? So for example, from a theoretical point of view a beech with a MaxAge of 400, should have f_age=0.5 almost by that age, and start to show some decline after 200 years. This can be indeed seen in figure.

Following your advice, we will keep this parameter out of calibration/tuning.

image

from r3pg.

DavidForrester avatar DavidForrester commented on August 29, 2024

Regarding the growth modifier (f_age), I think you have now understood it correctly. That is, the reason it is included in 3-PG, as far as I know, is because there is still a gap in our understanding of what actually causes the long-term declines in stand growth (i.e. the efficiency of converting absorbed PAR into biomass). We know of many age-related changes (e.g. some are included in 3-PG in terms of the SLA, litterfall etc parameters) but our understanding of a large part of this age-related decline is still so poorly understood (despite a couple of decades of research) that the f_age modifier is used.

Regarding the FR set to 1. This is not necessarily a problem. I think there are many sites/situations where it is reasonable to assume that soil fertility is not limiting growth. The problems might come when FR=1 is combined with other parameters or inputs that allow extreme growth. Perhaps a limiting factor is not being simulated properly, or allometric relationships are being used outside an appropriate range etc.

I think the height parameters probably need to be refit, but not tuned in the same way that 3-PG studies change a parameter value until the growth outputs match measurements. That is, they should be fit to some data, or to provide a certain shape for the relationship where height is described as a function of diameter and competition. I think you have understood this, but I just wanted to mention it to be sure. The use of yield tables is a good idea, but you also need to be mindful that the height predicted in by the equations in 3-PG is the mean height, and not the mean dominant height of the stand. So if using yield table data it will be important to make sure you are not overestimating the height (which would then lead to an overestimate of volume).

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Hi @DavidForrester !

I had another look at this issue, but this time I used the Profound Sites https://doi.org/10.5194/essd-12-1295-2020, so I can have some reference data. As we already discussed, the problem in my outputs was related to a very high biomass (biom_stem).

Using the parameter sets from your Swiss calibration, I simulated the Profound Sites and tried to tune the parameters, so the model would roughly fit the observed data of biomass, dbh and height. The good news is that I succeed. The bad news is that despite your advice on f_age, I did end up modifying r_age and n_age (also modifying fertility was necessary for a finer fit). This turned out to be the only way to keep the biom_stem in a realistic range, and also have model outputs that near the observed values. I had to use a rAge of around 0.125 (very far from the 0.95) and nAge between 3 and 4 for beech, pine and spruce. I noticed that you also use similar low values of rAge in the r3PG paper https://doi.org/10.1111/2041-210X.13474 when calibrating the Profound site Solling.

Morevoer, I observed that behaviour of self thinning rule is problematic when no thinning plan is used, and/or the simulations are relative long (over three decades?) and/or the f_age is not modified to have an abrupt decrease (rAge around 0.125). By problematic, I mean to have unrealistic big values of biom_stem, which translate into unrealistic values of stand variables.

I am aware of the complexity of forest model, and specially the complexity of modelling mortality, and I still have limited knowledge on this topic and thus, I might be missing something here. However, to me, it seems that the self-thinning mortality (defined by thinPower and wSx1000, which defines the maximum biomass of tree, and it is the condition for density dependent mortality) produces unexpected model behaviour and is responsible for the unrealistic outputs. The maximum tree biomass has an exponential growth and does not consider the total biomass of the stand. In practice, it can happen there is no limit to stand biomass (biom_stem) because at low tree densities, mortality will not occur.

After reading previous studies with 3PG, I assume that this issue did not show up so far as a relevant one, because thinning plans were used and/or the simulations were not long enough (I would be curious to know if anyone else encountered this problem). In fact, using a thinning plan modulates or even prevents the density mortality from happening, which could solve the problem. Yet, I do not think that this will always work out. For instance, instead of calibrating the model against observed data, we are using existing calibrated parameters and r3PG to explore management scenarios (no-management or different thinning intensities) and it is likely (we already did) that we face with the issue of unrealistic outputs.

I think that r3PG can be a very valuable tool for making predictions on forest growth and explore future management scenarios, and solving this issue is important for such purpose. As you mentioned, the self-thinning might not quite be resolved in relation to 3-PG. Regardless of the theoretical background, and based on the model behaviour, I do not see any other way than modifying rAge and nAge to prevent the self-thinning rule / the density-dependent mortality from leading the model to unrealistic biomass values. In a way, I figure that it is like introducing age in the density-dependent mortality. The existing parameter sets, like the one from the Swiss calibration, might be very good parameter sets, but when used on different stands (with or without thinning) could yield impossible values because of the density-dependent mortality.

from r3pg.

DavidForrester avatar DavidForrester commented on August 29, 2024

Hi https://github.com/Rasilgon,

This sounds plausible – there certainly appear to be problems with the self-thinning calculations that have not been resolved, although I think there have also been studies that did not include management (i.e. thinning) and did not have problems. Just to be sure, you mentioned that wSx1000 defines the maximum biomass of tree, but it only defines the maximum stem mass of trees growing at a tree density of 1000 trees per ha. So biomass of a tree can be much larger.

I guess if modifying the age parameters prevents the problem without causing any other problems then it is worth doing. To be more sure I would have to go through the simulations to look at the different output variables, but I don’t have time to do this at the moment because I am busy with a new job.

It is great that you are testing 3-PG like this and finding its limits. It might be good to make some of these runs available somehow so that other users can look through the outputs, and potentially start working on some solutions such as fixing the mortality calculations.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Hi David,

thanks for the quick reply! Yes, you are right, I was not accurate about wSx1000. I meant that the expression wSx1000 * (1000.d0 / stems_n_ha) ** thinPower defines the maximum stem biomass that a tree can have (biom_tree_max). This biomass grows exponentially. If the current mean tree stem biomass (biom_tree) of the stand is greater than biom_tree_max, the density-dependent mortality occurs. The total stem biomass of the stand (biom_stem) is not taking into account in this mortality, and the model allows unrealistic high values of biom_stem, specially with tree densities lower than 1000.

Considering my results, I will do a more thorough analysis before drawing any more conclusions.

I wonder if we should rather close this issue and open a new one about self-thinning/mortality and maximum biomass values, which fits better the discussion. Besides, if self-thinning has not been satisfactory resolved, it kind of makes sense to have it as an open issue. What do you think? And @trotsiuk and @florianhartig?

from r3pg.

trotsiuk avatar trotsiuk commented on August 29, 2024

Hi @Rasilgon

Thanks a lot for such an exploration and analysis.

I would agree with you that the new issue/discussion can be started for the self-thinning/mortality and this can be close.

From my exploration in the past, I have also seen a bit an 'issues' (maybe not) that mortality and thinning is a real value (not integer). With the very low numbers (I think <3 stems) it start to decrease exponentially and sometimes never gets to 0. Some ideas were to remove if it is below 1 or so (

!if( stems_n(i) < 1.d0 ) mort_thinn(i) = stems_n(i)
) but more need to be tested.

from r3pg.

DavidForrester avatar DavidForrester commented on August 29, 2024

Hi @Rasilgon

Opening a new issue sounds good to me.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Hi @DavidForrester,

I want to give an update to this issue, because I performed more analysis, and it is me who opened it.

You initially pointed out that in my simulation the trees were growing too fast and this could be the source of the trouble. I tried to tune the parameters to fix the issue, and it seemed that f_age was important.

To sort this out, I ran a bayesian calibration for some Profound sites as you did for Switzerland (same parameters and target variables). The difference from your setup is that I included f_age parameters and I expanded the range of alphaCx. In my understanding of the model, alphaCx is sort of defining the maximum (potential) growth speed.

The results of the calibration indicate that you were right. The problem is that trees grow too fast, and f_age is not relevant for keeping biomass values within a realistic range. This fits to your argumentation that f_age is there to simulate other aspects of age decline. So, tunning f_age parameters might not be the approach to fix this issue.

Based on the results, it would also seem that lower alphaCx values are an option for avoiding such unrealistic high values of biomass. In the figure below I used the parameters from Switzerland (central_swiss, red), and the ranges and central value of my calibration (range_own, green). With the parameters from Switzerland and a lower of alphaCx I can simulate the Profound site, in this case Solling beech. With the alphaCx value from Switzerland, the model outputs are very far from the observed data.

These are still not totally sound conclusions. However, I figure that unless I run a calibration with much more data, I will not find a better answer.

image

from r3pg.

DavidForrester avatar DavidForrester commented on August 29, 2024

Hi @Rasilgon,

Thanks for the update and nice work to find the possible causes. Lower alphaCx parameters values sound plausible to me. It is interesting to see how the results differ, and I guess how important it is to carefully consider where the data come from as well as how the Bayesian calibrations are set up in terms of the range of each variable. I hope you can publish some of these findings eventually.

from r3pg.

twest820 avatar twest820 commented on August 29, 2024

Another reason that is more plausible, is that if height is predicted not only from diameter, but from stand basal area (nHC parameter), then if the stand basal area increases, its negative effects on height might be even greater than the positive effect of diameter. This may not happen in reality, but it could happen in the model if the allometric height parameters are being used outside of the range where they were developed.

As an aside, I've been doing some height parameter fitting and can confirm both the power and exponential height equation forms can exhibit this behavior on actual stands with central parameter estimates. Not getting big declines―a fraction of a meter―but it's fairly unlikely the plots' top heights actually stalled for 5+ years. Decline would be correct for certain types of mortality from above but it is potentially problematic for episodic mortality from below (weather-linked suppression mortality waves and beetle attack or snow buckling of suppressed individuals, for example). One could alter the regression equation to accommodate this but, in general, it seems to me an individual tree model might be a more appropriate tool in such situations.

from r3pg.

Rasilgon avatar Rasilgon commented on August 29, 2024

Thanks @twest820 for sharing!

I think that the issue title is actually not very fortunate, regarding what my actual problem was. Initially, I was mainly checking forest management variables as height and dbh (see first plot), and wondering why there was no decline in height or dbh. After feedback from @DavidForrester and @trotsiuk, and more reading about 3PG, I realized that the underlying problem was biomass. Thus, I shifted the focus to biomass variables, which probably should be the title of this issue, something like "Very high or unrealistic biomass variables".

As I understood so far, height parameters are relevant to overall growth, but height and dbh are still being derived from biomass, which is the core of the simulation. In my opinion, the height parameters, which I am currently using, do not seem problematic. The last plot I posted here display this well. It shows outputs when using parameters from a calibration that targeted the biomass variables. The height and dbh parameters are exactly the same as I used to create the first plot.

To me, this issue is related to the used parameters and to the self-thinning rule. Concerning the parameters, I think that the way to go is calibration/tuning. Concerning the self-thinning rule, I feel like it deserves an issue, as we already discussed here, in which we focus on how it affects the model, and eventually, if there are any ideas on how to improve it. So, keeping this issue is not necessary, and thus, I am closing it. I have already opened an issue for density-dependent mortality (see #74 ).

from r3pg.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.