modelNDVI: Main function for NDVI correction and modelling

Description Usage Arguments Value Author(s) References See Also Examples


Fits a suite of functions/models to raw NDVI or selected NDVI observations (after BISE).


modelNDVI(ndvi.values,, multipleSeasons=FALSE, correction="bise", 
	method="LinIP", MARGIN=2, doParallel=FALSE, silent=TRUE, ...)



A vector or matrix containing NDVI observations with values in the interval (-1,1).

Observation year


Determines wether a season detection should be performed or not. Setting ‘multipleSeasons’ to TRUE forces following algorithms modelling NDVI and extracting phenological phases to be performed once per detected season.


A character string determining which method will be used for correction of NDVI values. Should be either:

none”: no correction will be performed.

ravg”: Smoothing with running average. Default window size is 7 and can be modified by parameter ‘window.ravg’. See also runningAvg.

bise”: Best index slope extraction after Viovy et. al (1992). Second interpretation of bise algorithm. Can be modified with parameter ‘slidingperiod’. Default to 40, optimised for the area of Central Europe. This might has to be modified when vegetation dynamics of other climates/habitats are analysed. An maximum increase threshold is defined via parameter ‘growthFactorThreshold’ with default to 0.1 (10 percent increase per day allowed). The timeserie is cycled via parameter ‘cycleValues’, which is a boolean value determining whether the end of the ndvi timeserie is combined with its beginning or not (default value is true). If false, gaps or low ndvi values at the beginning of timeserie influence the result.


Determines which model will be fitted to the corrected NDVI-timeserie (if the corrected timeserie is not available, the raw one out of ‘values’ will be used).

LinIP”: A linear interpolation is performed. For interpolation, the end of timeserie is connected to the beginning (e.g. after day 365 follows day 1). Applied in Badeck et. al (2004) and Doktor et. al (2009).

Spline”: A spline interpolation is performed. For interpolation, the end of timeserie is connected to the beginning (e.g. after day 365 follows day 1).

DSig”: Fits a double sigmoidal function to NDVI values (according to Zhang et. al (2003)).

DSigC”: Fits another double sigmoidal function (own C implementation) to NDVI values.

DLogistic”: Fits a double logistic function after Fischer, Alberte (1994) to NDVI values.

Gauss”: Fits a symmetric or asymmetric (determined by boolean parameter ‘asym’) gaussian function to NDVI values (own C implementation after Press, W.H. (1992)).

GaussMix”: Fits a mixture of gaussian functions to NDVI values (own C implementation after Press, W.H. (1992)). The number of components is determined by parameter ‘components’. If multiple components are given, the algorithm checks which number performs best.

Growth”: Fits a plant growth model after Richter et. al (1991) to NDVI values.

FFT”: Smoothes the corrected or raw NDVI values with fast fourier transformation (implemented in R). The smoothing intensity can be controlled with parameter ‘filter.threshold’ with default to 3.

SavGol”: Smoothes the corrected or raw NDVI values with a Savitzky-Golay filter (own C implementation after Press, W.H. (1992)). The smoothing algorithm can be modified with parameters ‘window.sav’ (window size of filter, default to 7), ‘degree’ (degree of fitting polynomial, default to 2) and ‘smoothing’ (repetition quantity, default to 10).


A vector giving the subscripts which the function will be applied over. E.g., for a matrix ‘1’ indicates rows, ‘2’ indicates columns, ‘c(1, 2)’ indicates rows and columns. Where ‘X’ has named dimnames, it can be a character vector selecting dimension names.

Should be ‘2’ if ‘ndvi.values’ is a vector instead of a matrix/array.


This method uses 'foreach'. If a parallel backend is registered, setting ‘do.parallel’ to ‘TRUE’ enables parallel processing.


A boolean flag determining whether debug information is shown.


Other parameters passed to correction or modelling function. These are: ‘slidingperiod’ for correction “bise”, ‘window.ravg’ for correction “ravg”, ‘asym’ for method “Gauss”, ‘filter.threshold’ for method “FFT” and ‘degree’, ‘window.sav’ and ‘smoothing’ for method “SavGol”.


Returns an object of type ‘NDVI’ containing raw data, corrected NDVI values and modelled NDVI values.


Lange, Maximilian and Doktor, Daniel


Badeck, F.W., Bondeau, A., Boettcher, K., Doktor, D., Lucht, W., Schaber, J. and Sitch, S. (2004). Responses of spring phenology to climate change. New Phytologist, 162, 295-309.

Doktor, D., Bondeau, A., Koslowski, D. and Badeck, F.W. (2009). Influence of heterogeneous landscapes on computed green-up dates based on daily AVHRR NDVI observations. Remote Sensing of Environment, 113, 2618-2632

Fischer, Alberte (1994). A Model for the Seasonal Variations of Vegetation Indices in Coarse Resolution Data and Its Inversion to Extract Crop Parameters. Remote Sensing of Environment, 48, 220-230.

Press, W.H. (1992). Numerical recipes in C: The Art of Scientific Computing, vol. 1. Cambridge University Press, Cambridge, 2nd edn.

Richter, O., Spickermann, U. and Lenz, F. (1991). A new model for plant-growth. Gartenbauwissenschaft, 56, 99-106.

Viovy, N., Arino, O. and Belward, A.S. (1992). The Best Index Slope Extraction (BISE) - a method for reducing noise in NDVI time-series. International Journal of Remote Sensing, 13, 1585-1590.

Zhang, X.Y., Friedl, M.A., Schaaf, C.B., Strahler, A.H., Hodges, J.C.F., Gao, F., Reed, B.C. and Huete, A. (2003). Monitoring vegetation phenology using MODIS. Remote Sensing of Environment, 84, 471-475.

See Also

bise, runningAvg,detectSeasons, NDVI, phenoPhase



# create NDVI object, correct and model values
ndvi.list1 <- modelNDVI(ndvi.values=cbind(avhrr.ndvi/10000, modis.ndvi/10000),, multipleSeasons=FALSE, correction="bise", 
			method="LinIP", MARGIN=2, doParallel=FALSE, slidingperiod=40)
ndvi.list2 <- modelNDVI(ndvi.values=cbind(avhrr.ndvi/10000, modis.ndvi/10000),, multipleSeasons=FALSE, correction="ravg", 
			method="FFT", MARGIN=2, doParallel=FALSE, filter.threshold=7)

# plot Values
for (ndvi.ob in ndvi.list1){ plot(ndvi.ob) } 
for (ndvi.ob in ndvi.list2){ plot(ndvi.ob) }

Example output

phenex documentation built on May 1, 2019, 10:56 p.m.

Related to modelNDVI in phenex...