I was also looking to calculate R2 between two images, and couldn't find a reducer to do this -- only for the Pearson correlation coefficient. Here is my current solution showing both (Pearson correlation coefficient and coefficient of determination, i.e. R2)).
Hopefully there is either a reducer that I missed, or a more elegant solution that someone can share.
https://code.earthengine.google.com/9b66ed88a7c0d581c6d484f16dac70c1
var geometry =
ee.Geometry.Polygon(
[[[-117.24411029815674, 40.07684302769587],
[-117.24411029815674, 40.06830460341872],
[-117.23411102294922, 40.06830460341872],
[-117.23411102294922, 40.07684302769587]]]);
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_041032_20140108")
var image1 = image.select("B2")
var image2 = image.select("B3")
Map.addLayer(image1.clip(geometry),{min:0,max:0.3},"B2")
Map.addLayer(image2.clip(geometry),{min:0,max:0.3},"B3")
Map.centerObject(geometry,15)
image = image.select(["B2","B3"])
var values = image
.reduceRegion(ee.Reducer.toList(), geometry, 30)
print("Values: ", values)
// Pearson correlation coefficient:
var pearsonR = image.reduceRegion(
{
geometry: geometry,
reducer: ee.Reducer.pearsonsCorrelation(),
scale:30
})
print("Pearson R(B2,B3):", pearsonR.get("correlation"))
// Coefficient of determination:
function R2(image, fitted, geometry, scale){
image = image.rename("constant")
fitted = fitted.rename("constant")
var SSres = image.subtract(fitted).pow(2)
.reduceRegion({
geometry:geometry,
reducer:ee.Reducer.sum(),
scale:scale
})
var imageMean = image.reduceRegion({
geometry:geometry,
reducer:ee.Reducer.mean(),
scale:scale
}).toImage(["constant"]);
var SStot = image.subtract(imageMean).pow(2)
.reduceRegion({
geometry:geometry,
reducer:ee.Reducer.sum(),
scale:scale
})
var coeff = ee.Number(1).subtract(
ee.Number(SSres.get("constant"))
.divide(ee.Number(SStot.get("constant"))))
return coeff
}
// R2 using B2 as y_true and B3 as y_fitted:
var coeff = R2(image1,image2,geometry, 30);
print("R2(y_true=B2, y_fitted=B3): ", coeff)