Guest Post by Willis Eschenbach
I had an idea a couple days ago about how to estimate cloud feedback from observations, and it appears to have panned out well. You tell me.
Figure 1. Month-to-month change in 5° gridcell actual temperature ∆T, versus gridcell change in net cloud forcing ∆F. Curved green lines are for illustration only, to highlight how many of the datapoints fall outside those lines in each of the four quadrants. Results have been area-weighted, giving a slightly smaller slope (-1.7 W/m2 per degree) than initally reported (- 1.9 W/m2 per degree). Data colors indicate the location of the gridcell, with the Northern hemisphere starting with blue at the far north, slowly changing to yellow and to red at the equator. From there, purple is southern tropic, through pink to green for the farthest south latitudes. Updated.
Cloud feedback is what effect the changing clouds have if the earth warms. Will the clouds act to increase a warming, or to diminish it? The actual value of the cloud feedback is one of the big unknowns in our current understanding of the climate.
The climate models used by the IPCC all say that as the earth warms, the clouds will act to increase that warming. They all have a strong positive cloud feedback. My thunderstorm and cloud thermostat hypothesis, on the other hand, requires that the cloud feedback be strongly negative, that clouds act to decrease the warming.
My idea involved the use of what are called “gridded monthly climatologies”. A monthly climatology is a long-term month-by-month average of some climate variable of interest. “Gridded” means that the values are given for each, say, 5° latitude by 5° longitude gridbox on the surface of the planet.
My thought was to obtain the monthly actual temperature gridded climatology. This is the real temperature “T” as measured, not the anomaly. In addition, I would need the gridded net cloud forcing “F” from the ERBE (Earth Radiation Budget Experiment) data. Net cloud forcing is the balance of how much solar energy the clouds reflect away from the earth on the one hand, and on the other, how much the same clouds increase the “greenhouse” downwelling longwave radiation (DLR). Net cloud forcing varies depending on the type, thickness, altitude, droplet size, and color of a given cloud. Both positive and negative cloud forcing are common. By convention, positive net cloud forcing (e.g. winter night-time cloud) is warming, while a negative net cloud forcing (e.g. thick afternoon cumulus) is cooling.
Remembering that a cloud feedback is a change in net forcing in reference to a change in temperature, I took the month to month differences of each of the two climatologies . I did this in a circular fashion, each month minus the previous month, starting from February minus January, around to January minus December. That gave me the change in temperature (∆T) and the change in forcing (∆F) for each of the twelve months.
The ERBE satellite only covers between the Arctic and Antarctic circles, the poles aren’t covered. So I trimmed the polar regions from the HadCRUT absolute temperature to match. Then, the HadCRUT3 absolute temperature data are on a 5° grid size, while the ERBE satellite data is on a 2.5° grid. Since the grid midpoints coincided, I was able to use simple averaging to “downsample” the satellite cloud forcing data to correspond with the larger temperature gridcell size.
The results of the investigation are shown in Figure 1. The globally averaged cloud feedback is on the order of -1.9 watts per square metre for every one degree of monthly warming.
This result, if confirmed, strongly supports my hypothesis that the clouds act as a very powerful brake on any warming. At typical Earth surface temperatures, the Stefan-Boltzmann equation gives about five watts per square metre (W/m2) of additional radiation per degree. That is to say, to warm the surface by 1°C, the amount of incoming energy has to increase by about 5 W/m2. This, of course, means that if there were no feedbacks, a doubling of CO2 (+3.7 watts per square metre per the IPCC) would only cause about 3.7/5 or about three-quarters of a degree of warming. The models jack this three-quarters of a degree up to three degrees of warming by, among things, their large positive cloud feedback.
But this analysis says that the cloud feedback is strongly negative, not positive at all. As a result, a doubling of CO2 could easily cause less than eight-tenths of a degree of warming. If the cloud negative feedback is actually -1.9 W/m2 per degree as shown above, and it were the only feedback, a doubling of CO2 would only cause half a degree of warming …
If confirmed, I think that this is a significant result, so I put it up here for people to check my math and my logic. I’ve fooled myself with simple mistakes before …
Code for the procedures and data is appended below.
All the best,
w.
PS – please, no claims that the “greenhouse effect” is a myth or that DLR doesn’t exist or that DLR can’t transfer energy to the ocean. I’m beyond that, whether you are or not, and more to the point, there are plenty of other places to have that debate. This is a scientific thread with a specific subject, and if necessary I may snip such claims (and responses) to avoid thread drift. If so, I will indicate such excisions.
NOTE: The slope of the trend line in Figure 1 is now properly area-adjusted, making the following section andFigure 2 superfluous. .[UPDATE] I’ve gone back and forth about whether to area-average. The problem is that the gridcells are not the same size everywhere. The usual way to area-average is to multiply the data by the cosine of the mid latitude, so I have done that.
Figure 2 shows the area-adjusted version. Still a significant negative feedback from clouds, but smaller than in the non-adjusted version.
FIGURE 2 REMOVED
Figure 2. Area adjusted cloud feedback. Note the lower estimate of the cloud feedback, a bit smaller than my initial estimate. Color of the dots indicates latitude, ranging from blue at the furthest north through cyan to the equator, then in the southern hemisphere through yellow to red at the furthest south.
Note that we still see the same form in the four quadrants. It is still rare for a large temperature drop to be associated with anything but a rise in the cloud forcing.
I’m still not completely happy with this method of area-adjusting, because it adjusts the data itself. But I think it’s better than no area-adjusting at all. The best way would be to convert both of the datasets to equal-area cells … but that’s a large undertaking and I think the final result won’t be much different from this one.
[UPDATE] Here’s the two hemispheres:
Figure 3. Northern Hemisphere Cloud Feedback. Color of the dots indicates latitude, ranging from blue at the furthest north through yellow in the subtropics, to red at the equator.
Figure 4. Southern Hemisphere Cloud Feedback. Color of the dots indicates latitude, ranging from green at the furthest south through pink in the subtropics, to purple at the equator.
[UPDATE] To better inform the discussion, I have made up the following maps of the variables of interest, month by month. These are the monthly absolute temperatures T, the monthly net cloud forcings F, and the month by month changes (deltas) of those variables, ∆T and ∆F.
Figure 5. Absolute temperature (T)
Figure 6. Net Cloud Forcing (F)
Figure 7. Change in absolute temperature (∆T)
Figure 8. Change in net cloud forcing (∆F)
APPENDIX: R code to read and process the data (not including the updated charts). I've tried to keep wordpress from munging the code, but it likes to either put in or not put in carriage returns.
===================================
# data is read into a three dimentional array [longitude, latitude, month]
diffannual=function(x){# returns month(t+1) minus month(t)
x[,,c(2:12,1)]-x
}
# rotates the circle of months by n
rotannual=function(x,n){
if (n!=0) {
if (n>=0){
x[,,c((n+1):12,1:n)]
} else {
x[,,c((13+n):12,1:(12+n))]
}
} else
x
}
#_averages_2.5°_gridcells_into_5°_gridcells,_for_[long,lat,mon]_array
downsample=function(x){
dx=dim(x)
if (length(dx)==3){
reply=array(NA,c(dx[1]/2,dx[2]/2,dx[3]))
for (i in 1:dx[3]){
reply[,,i]=downsample2d(x[,,i])
}
} else {
reply=downsample2d(x)
}
reply
}
# averages 2.5° gridcells into 5° gridcells for [long, lat] 2D array
downsample2d=function(x){
width=ncol(x)
height=nrow(x)
smallforcing=matrix(NA,height/2,width/2)
for (i in seq(1,height-1,2)){
for (j in seq(1,width-1,2)){
smallforcing[(i+1)/2,(j+1)/2]=mean(c(x[i,j],x[i+1,j],x[i,j+1],x[i+1,j+1]),na.rm=T)
}
}
as.matrix(smallforcing)
}
# EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE End Functions
# LLLLLLLLLLLLLLLLLLLLLLLLLL LOAD DATA ----- gets the files from the web
# HadCRUT absolute temperature data
absurl="http://www.cru.uea.ac.uk/cru/data/temperature/absolute.nc"
download.file(absurl,"HadCRUT absolute.nc")
absnc=open.ncdf("HadCRUT absolute.nc")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5jan/data.txt","albedojan.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5feb/data.txt","albedofeb.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5mar/data.txt","albedomar.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5apr/data.txt","albedoapr.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5may/data.txt","albedomay.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5jun/data.txt","albedojun.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5jul/data.txt","albedojul.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5aug/data.txt","albedoaug.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5sep/data.txt","albedosep.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5oct/data.txt","albedooct.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5nov/data.txt","albedonov.txt")
download.file("http://badc.nerc.ac.uk/browse/badc/CDs/erbe/erbedata/erbs/mean5dec/data.txt","albedodec.txt")
albnames=c("albedojan.txt","albedofeb.txt","albedomar.txt","albedoapr.txt","albedomay.txt","albedojun.txt","albedojul.txt","albedoaug.txt","albedosep.txt","albedooct.txt","albedonov.txt","albedodec.txt")
# read data into array
forcingblock=array(NA,c(52,144,12))
for (i in 1:12){
erbelist=read.fwf(albnames[i],skip=19,widths=rep(7,13))
erbelist[erbelist==999.99]=NA
erbeout=erbelist[,13][which((erbelist[,1]>-65) & (erbelist[,1]
length(erbeout)
forcingblock[,,i]=matrix(erbeout,52,144,byrow=T)
}
# DOWNSAMPLE FORCING DATA TO MATCH TEMPERATURE DATA,
# and swap lat and long to match HadCRUT data
smallforcing=aperm(downsample(forcingblock),c(2,1,3))
smallforcing[1:72,,]=smallforcing[c(37:72,1:36),,]# adjust start point
# GET ABSOLUTE DATA, TRIM POLAR REGIONS
absblock= get.var.ncdf(absnc,"tem")
smallabs=absblock[,6:31,]
#dim(absblock)
# GET MONTH-TO-MONTH DIFFERENCES
dabs=diffannual(smallabs)
dforcing=diffannual(smallforcing)
dim(dforcing)
#SAVE DATA
save(forcingblock,smallforcing,smallabs,dabs,dforcing,file="erbe_cloud_forcing.tab")
# make cosine weight array
cosarray=array(NA,c(72,26,12))
cosmatrix=matrix(rep(cos(seq(-62.5,62.5,by=5)*2*3.14159/360),72),72,26,byrow=T)
cosmatrix=cosmatrix/mean(cosmatrix[1,])
cosarray[,,1:12]=cosmatrix
cosarray[,,2]
# GET CORRELATION, SLOPE, AND INTERCEPT
#cor(dabs,dforcing,use="pairwise.complete.obs")
module=lm(dforcing~dabs)
m=module$coefficients[2]
b=module$coefficients[1]
#Plot Results
par(mgp=c(2,1,0))
plot(dforcing~dabs,pch=".",main="Cloud Feedback, 65°N to 65°S", col="deepskyblue3",xlab="∆ Temperature (°C)",ylab="∆ Cloud Forcing (W/m2)")
lines(c(m*(-20:15)+b)~c(-20:15),col="blue",lwd=2)
textcolor="lightgoldenrod4"
text(-20,-60,"N = 18,444",adj=c(0,0),col= textcolor)
text(-20,-70,paste("Slope =",round(m,1),"W/m2 per degree C of warming"),adj=c(0,0),col= textcolor)
text(-20,-80,paste("p = ","2E-16"),adj=c(0,0),col= textcolor)
To use your language from a previous post:
* the cause of ΔT is the tilt of the earth and changes in TOA insolation.
* a 1st order affect is land vs ocean (clearly visible on your maps of ΔT)
* clouds would be a 1st or 2nd order effect.
Until you have separated out the effect of the seasons (and the effect of land vs ocean), I think finding a signal in the clouds will be tough. For example, whether a region gets more cloudy or less cloudy in the fall, it will cool.
I’ve had a chance to review the data and I’ve come to the realization that your analysis is missing a major confounding factor, namely the incoming solar radiation. The quantity being analyzed is the net cloud forcing, namely the total outgoing radiation attributable to clouds. This does not measure the efficiency of clouds in dealing with a fixed level of incoming radiation, the relevant quantity if we’re interested in feedback from CO2 related changes. Stated more simply, the more sunlight coming in, the more sunlight is reflected off of clouds. Furthermore, increasing sunlight causes the air to heat up giving rise to the potential for a spurious correlation.
With this in mind I redid the regression analysis adding incoming solar radiation as one of the explanatory variables. In the following printout, dncf is the change in the net cloud forcing, dtem is the change in the temperature and dtsi is the change in the solar forcing. The tsi is determined from the ERBE file as the sum of the outgoing long wave radiation, the outgoing shortwave radiation and the net radiation. After a review of the scatter plot of dncf vs dtsi, I concluded that there is an obvious non-linear relationship between the two variables, which is reasonably approximated by a cubic spline of three degrees of freedom. So with that introduction, here’s the output of the analysis.
[sourcecode]
Call:
lm(formula = dncf ~ ns(dtsi, 3) + dtem, data = df2, weights = df2$area)
Residuals:
Min 1Q Median 3Q Max
-75.538 -4.112 0.089 4.138 53.575
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 42.46878 0.45574 93.19 <2e-16 ***
ns(dtsi, 3)1 -23.68547 0.31780 -74.53 <2e-16 ***
ns(dtsi, 3)2 -104.67009 1.03840 -100.80 <2e-16 ***
ns(dtsi, 3)3 -61.00918 0.46796 -130.37 <2e-16 ***
dtem 1.38452 0.03608 38.37 <2e-16 ***
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.575 on 18439 degrees of freedom
(4020 observations deleted due to missingness)
Multiple R-squared: 0.554, Adjusted R-squared: 0.5539
F-statistic: 5726 on 4 and 18439 DF, p-value: < 2.2e-16
[/sourcecode]
The R squared is now 55%, with about 51% attributable to the incoming radiation. The sensitivity to the temperature has now flipped signs. Given this model the uncertainty in the coefficients is nil, but that does not preclude the possibility of other confounding factors. Furthermore, as Roy Spencer so frequently notes, it’s not clear whether changes in clouds drive changes in temperature or vice versa.
Joseph Dunn says:
October 11, 2011 at 12:03 pm (Edit)
Joseph, you’ve entirely misunderstood what I wrote. I have completely included the incoming solar radiation. It is called “Insolation”. It is reflected in the map as well as in the phase diagrams.
w.