How can I calculate Vapor Pressure Deficit from Temperature and Relative Humidity?

I have a series of measurements of temperature and relative humidity (RH), together with mosquito capture data. Because mosquitoes are sensitive to desiccation, it's reasonable that RH may be useful in predicting their activity. But I recently heard of a value called saturation deficit or vapor pressure deficit which has been well correlated with evapotranspiration in plant leaves.

Is it accurate to say saturation deficit is the "perceived dryness" or "drying power" of the air?

Can saturation deficit be calculated directly from temperature and RH? Is it dependent on elevation, air pressure or anything else (all measurements are <600m above sea level).

How do we calculate it? I have found two methods online which give wildly different results.

• That deficit (I think Omegas answer is right) is absolutely unneccesary! Who ever "Invented" that, either was silly or tried to sell some "novelty". Commented Feb 1, 2011 at 10:31
• Why unnecessary? If I want to predict water loss from living tissue, do you think it is not biologically more meaningful than RH? Commented Feb 1, 2011 at 20:20
• There is some maximal humidity, in relative measure this is "100 %" If You have 60 % RH Your "perceived dryness" is 40 %! This is a problem of elemetary school "math". All science and tech works since decades with relative humidity, do You really think it is wise to join in into that "creation"? Commented Feb 1, 2011 at 21:01
• Not that age of a concept is proof of its superiority, but it may reassure you to know that "saturation deficit" has been around for awhile. References as early as 1920 show survival time of insects is inversely related to saturation deficit and not simply to the relative humidity. An organism's rate of moisture loss is proportional to the vapor pressure difference between the evaporating surface and the surrounding air. Saturation deficit is a better expression of the evaporating power of air than RH because it can be expressed independently of temperature. Commented Feb 1, 2011 at 21:14
• Jon, the answer to relative humidity alone is no. The saturation pressure increases roughly exponentially, with a doubling every roughly 10C. So the temperature is probably the most important measurement. Saturation deficit makes sense, since these people are fitting noisy field data, and fitting fewer degrees of freedom (which have some physical bsis) is the way to go. Commented Feb 3, 2011 at 21:38

From [The ASCE Standardized Reference Evapotranspiration Equation]1

Given T is temperature in degrees Celsius, and RH is relative humidity:

Saturation Vapor Pressure (es) =

0.6108 * exp(17.27 * T / (T + 237.3))


Actual Vapor Pressure (ea) =

RH / 100 * es


Vapor Pressure Deficit =

ea - es


Why this is a meaningful measurement: "The strain under which an organism is placed in maintaining a water balance during temperature changes is much more clearly shown by noting the vapor pressure deficit than by recording the relative humidity." Anderson, D. B. 1936. Relative humidity or vapor pressure deficit. Ecology 17, no. 2: 277–282.

• I guess VPD is in hPa here? Commented Oct 15, 2018 at 2:54

From Dennis Hartman "Global Physical Climatology" (p 350)

Given relative humidity in percent ($RH$) and temperature in Kelvin ($K$):

First, calculate saturation vapor pressure, $e_s$ in millibars (mb):

$$e_s= 6.11*exp\left( \frac{L}{R_v}\left(\frac{1}{273} - \frac{1}{T}\right) \right)$$

Where $L$ is the latent heat of vaporization, $2.5\times10^6\text{ J kg}^{-1}$, $R_v$ is the gas constant for water vapor ($461 \text{ J K}^{-1}\text{kg}^{-1}$.

Then calculate vapor pressure deficit, $vpd$, which is the difference between the saturation vapor pressure and the actual vapor pressure:

$$vpd = e_s*(100-RH)/100$$

Here are two functions written in R that will do this:

get.es <- function(temp){
es <- 6.11 * exp((2.5e6 / 461) * (1 / 273 - 1 / (273 + temp)))
return(es)
}

get.vpd <- function(rh, temp){
## calculate saturation vapor pressure
es <- get.es(temp)
## calculate vapor pressure deficit
vpd <- ((100 - rh) / 100) * es
return(vpd)
}


And to test them out, you can plot the relationship between temperature and es (black) and at 50% RH, for example (in red):

temp <- -30:30
plot(temp, get.es(temp), type = "l", xlab = "T", ylab = "es or vpd")
lines(temp, get.vpd(50, temp), col = "red")


• Why does the above equation have (1/T), but the R equation have (1/(273+T))? Is it because the Hartman equation requires temperature units of K while the R equation takes temperature units in Celsius? Commented May 30, 2018 at 16:12
• @blaylockbk yes, I corrected my answer to state that the equation uses K but the R function uses C Commented Jun 2, 2018 at 4:49

After checking the reference James suggested:

Allen, RG, Pereira, LS, Raes, D, Smith, M (1998) Meteorological data, Chapter 3. In: Crop evapotranspiration - Guidelines for computing crop water requirements. Food and Agricuture Organization (FAO) Irrigation and Drainage Paper 56. United Nations, FAO, Rome, Italy. Available from http://www.fao.org/docrep/x0490e/x0490e07.htm#calculation%20procedures

I found that, in the reference, it is less recommended to calculate Actual vapour pressure (ea) using mean relative humidity (as the get.ea function)

# function suggested by James
# Calculate actual vapor pressure (ea)
get.ea <- function(rh, tmin, tmax){
esm <- get.esm(tmin, tmax)
ea <- (rh/100) * esm
return(ea)
}


according to the reference http://www.fao.org/docrep/x0490e/x0490e07.htm#calculation%20procedures, Eq. 17, ea = [e°(Tmin) RHmax/100 + e°(Tmax) RHmin/100]/2, it is recommended to derive ea from maximum and minimum relative humidity rather than from the mean relative humidity.

therefore, the function get.ea can be modified as follows.

# reference http://www.fao.org/docrep/x0490e/x0490e07.htm#calculation%20procedures, Eq. 17
# Calculate actual vapor pressure (ea)
# based on maximum and minimum relative humidity

get.ea <- function(rhmin, rhmax, tmin, tmax){
esmn <- get.esmn(tmin) # other fun same as James suggested
esmx <- get.esmx(tmax)
ea <- (esmn * rhmax/100 + esmx * rhmin/100) / 2
return(ea)
}


Except for the modification of get.ea, the other functions are same as James suggested.

By the name I think it is simply the difference between vapor pressure at saturation and the actual vapor pressure. The later should simply be the relative humidity times the vapor pressure at saturation. You should be able to find some tables (or formulas for vapor pressure as a function of temperature). You can look up vapor pressure in Wikipedia. They give a formula they call the Antoine equation. Also more theoretically you could look at the Clausius-Clapeyron equation, but I think it would be easier just to plug in the Antoine equation instead.

• Thanks I know that your first sentence is correct, and I will pursue the rest. Under normal daily atmospheric variations, and elevation difference of a few hundred meters, is vapor pressure at saturation relatively constant? Commented Feb 1, 2011 at 20:18
• jonw, I doubt pressure has much of an effect. Bigger unknowns are probably related to transport, wind speed relative to the insect. And the insects temperature probably differs from ambient, and I suspect the bug temperature is what effects the physics. Commented Feb 3, 2011 at 21:41
• Thanks, I check marked your answer. A resting tiny insect stays pretty close to ambient temperature, but mosquitoes will tend to seek a sheltered microclimate if the ambient conditions are too harsh. Thus VPD is a fair predictor of biting behavior. Commented Feb 3, 2011 at 21:53

R Code for calculating Vapor Pressure Deficit (kPa) from temperature and relative humidity using equations from Allen et al. (1998)

Vapor Pressure Deficit (VPD) = Saturation Vapor Pressure (ES) – Actual Vapor Pressure (EA). Below is R code for estimating VPD using mean minimum and maximum monthly temperatures and mean monthly relative humidity according to Allen et al. (1998). I have used a VPD index for calculating the Growing Season Index of Jolly et al. (1995) for a variable in ecological niche modeling.

Allen, RG, Pereira, LS, Raes, D, Smith, M (1998) Meteorological data, Chapter 3. In: Crop evapotranspiration - Guidelines for computing crop water requirements. Food and Agricuture Organization (FAO) Irrigation and Drainage Paper 56. United Nations, FAO, Rome, Italy. Available from http://www.fao.org/docrep/x0490e/x0490e00.htm#Contents (Accessed 11 June 2014)

Jolly, WM, Nemani, R, Running, SW (2005) A generalized, bioclimatic index to predict foliar phenology in response to climate. Glob Chang Biol 11:619–632

Calculate Vapor Pressure Deficit (in KPa, Kilopaschals) in R according to equations of Allen et al. (1998) for Example 5 using mean monthly minimum (tmin) and maximum (tmax) temperatures (Celsius) and mean monthly pecent relative humidity (rh, 100 = 100%): [http://www.fao.org/docrep/x0490e/x0490e07.htm#chapter 3 meteorological data]

Declare in R values of three required environmental variables from Example 5 of Allen et al. (1998)

tmin <- 18 tmax <- 25 rh <- 68

Using rh = 68 as mean of 82% and 54% rh in example; so, final vpd value will not exactly match example

Calculate saturation vapor pressure for mean minimum monthly temperature (esmn)

get.esmn <- function(tmin){ esmn <- .6108 * exp((17.27 * tmin) / (tmin + 237.3)) return(esmn) }

Calculate saturation vapor pressure for mean maximum monthly temperature (esmx)

get.esmx <- function(tmax){ esmx <- .6108 * exp((17.27 * tmax) / (tmax + 237.3)) return(esmx) }

Calculate mean saturation vapor pressure (esm)

get.esm <- function(tmin, tmax){ esmn <- get.esmn(tmin) esmx <- get.esmx(tmax) esm <- (esmn + esmx)/2 return(esm) }

Calculate actual vapor pressure (ea)

get.ea <- function(rh, tmin, tmax){ esm <- get.esm(tmin, tmax) ea <- (rh/100) * esm return(ea) }

Calculate vapor pressure deficit (vpd = esm - ea; getting esm and ea functions)

get.vpd <- function(rh, tmin, tmax){ esm <- get.esm(tmin, tmax) ea <- get.ea(rh, tmin, tmax) vpd <- esm - ea return(vpd) }

Check variable values and results

esmn <- get.esmn(tmin) esmx <- get.esmx(tmax) esm <- get.esm(tmin, tmax) ea <- get.ea(rh) vpd <- get.vpd(rh, tmin, tmax)

Define temp (mean temperature), tmin and tmax for plotting relationship of esm and vpd

get.temp <- function(tmin, tmax){ temp <- (tmin + tmax)/2 return(temp) } tmin <- -40:20 tmax <- -20:40

Plot relationship of esm and vpd to mean temperature

plot(get.temp(tmin,tmax), get.esm(tmin, tmax), type = "l", xlab = "Temp (C)", ylab = "esm (black) or vpd (red) (kPa)") lines(temp, get.vpd(50, tmin, tmax), col = "red")

• Can anyone say why this answer was downvoted? Is it wrong? It is helpful if it is not wrong. Commented Nov 9, 2017 at 18:23
• @generic_user: The coding is poor, for example, the get.esmn and get.esmx functions are identical, and should be merged, and get.ea should function on one T value, not two. The get.esm function is also fairly unnecessary for a basic average of two values. Also, the example includes a tonne of stuff that's not relevant to the question (e.g. OP didn't ask about a range of temperatures, just one temperature, and the Jolly reference is irrelevant). All that makes it fairly hard to read, considering the answer can be given in a few lines. Commented Oct 15, 2018 at 5:23