Resistivity Normalization
On this page
Summary
Resistivity spans several decades and its errors are multiplicative, so it is normalized on log10 of the curve and not on the curve itself. A shift in log space is one multiplicative factor, and a two-point map in log space is a power law. Use it only after environmental and invasion effects are ruled out as the cause of the difference between wells.
Inputs and outputs
| Item | Units | |
|---|---|---|
| Input | True formation resistivity | ohm·m |
| Input | Source low pick | |
| Input | Source middle pick | |
| Input | Source high pick | |
| Input | Reference low value | |
| Input | Reference middle value | |
| Input | Reference high value | |
| Output | Log-space normalized resistivity | ohm·m |
| Output | Linear-space normalized resistivity | ohm·m |
| Output | Log-space shifted resistivity | ohm·m |
| Output | Log-space slope (exponent) |
Equations
Work in \(\log_{10}\) of the picks and of the curve. Let \(\nrmSrcLow\), \(\nrmSrcMid\) and \(\nrmSrcHigh\) be percentile picks of deep resistivity \(\Rt\) in the reference interval, and \(\nrmRefLow\), \(\nrmRefMid\) and \(\nrmRefHigh\) the same percentiles in the key well (all in ohm·m).
Log-space shift (one multiplicative factor):
Log-space two-point map. A straight line in \(\log_{10}\) resistivity with slope \(\rtExp\):
If \(\rtExp = 1\) the map is the pure factor \(\nrmRefLow/\nrmSrcLow\).
Linear-space two-point map (shown for comparison; not recommended for resistivity):
Percentile picks are the same whether they are taken on resistivity or on its logarithm, because the logarithm is monotonic, so the picks need no conversion. Only the arithmetic of the map is done in log space.
| Symbol | Variable | Units | Typical range |
|---|---|---|---|
| \(R_t\) | True formation resistivity | ohm·m | 0.2 to 2000 |
| \(p_{\mathrm{lo}}\) | Source low pick | ||
| \(p_{\mathrm{mid}}\) | Source middle pick | ||
| \(p_{\mathrm{hi}}\) | Source high pick | ||
| \(r_{\mathrm{lo}}\) | Reference low value | ||
| \(r_{\mathrm{mid}}\) | Reference middle value | ||
| \(r_{\mathrm{hi}}\) | Reference high value | ||
| \(R_{t,\log}\) | Log-space normalized resistivity | ohm·m | |
| \(R_{t,\mathrm{lin}}\) | Linear-space normalized resistivity | ohm·m | |
| \(R_{t,\mathrm{ls}}\) | Log-space shifted resistivity | ohm·m | |
| \(s_{R}\) | Log-space slope (exponent) |
Single-value calculator
Behavior
The log-space shift and the log-space two-point map track each other closely when the wells differ by a single factor (the exponent here is 0.986, nearly 1). The linear-space map does not: it adds the same absolute amount at every resistivity, so it over-corrects the low values and under-corrects the high ones. At 0.2 ohm·m the log maps give 0.30 ohm·m and the linear map 0.37; at 20 ohm·m they give 27.9, 27.8 and 29.9 for the log two-point, linear and log shift; and at 200 ohm·m, 270.3, 277.3 and 299.2. When the true offset is a constant factor of about 1.5, as in the worked example, the log shift recovers it at every resistivity, while the two-point maps, whose slope is estimated from noisy high percentiles, drift away from it at the high end. On the plot, which has linear axes, the three curves are close to straight lines through the origin and separate only at the high end.
Parameter guidance
Do it in log space. Resistivity is close to log-normally distributed, so the 5th, 50th and 95th percentiles are a sensible description of it in log10 and a poor one in ohm·m. Use the log-space shift as the default. A two-point log map (with an exponent different from 1) is only justified when the picks differ by genuinely different factors at the low and high ends; with noisy picks it is more likely to add error than remove it.
Choose an interval where resistivity should be the same. A thick shale or other water-wet, uniform interval above the reservoir is the usual choice. Do not use a hydrocarbon-bearing interval, and be careful with an interval where invasion differs between wells (different mud, a longer time between drilling and logging).
Choose the curve carefully. Normalize the deep curve only after checking that the difference between wells is not a difference of tool type (induction versus laterolog), borehole size or mud resistivity that should have been corrected. See Histogram and Percentile-Based Picks for choosing the picks and Curve Normalization for when not to normalize at all.
Worked example
Two synthetic wells with log-normal resistivity in a reference interval: a 3 ohm·m shale and a 30 ohm·m tight zone. The second well reads a factor of 1.5 low everywhere. The picks are the 5th, 50th and 95th percentiles; the maps are compared with the known correct values at several resistivities.
rng = np.random.default_rng(21)
# Synthetic deep resistivity in a reference interval: log-normal, a 3 ohm.m shale and a 30 ohm.m tight zone.
# The second well reads a constant factor 1.5 low everywhere (a multiplicative offset).
shale = rng.random(500) < 0.6
key = 10 ** np.where(shale, rng.normal(np.log10(3.0), 0.10, 500), rng.normal(np.log10(30.0), 0.12, 500))
tgt = 10 ** np.where(shale, rng.normal(np.log10(3.0), 0.10, 500), rng.normal(np.log10(30.0), 0.12, 500)) / 1.5
p = [5, 50, 95]
k = np.percentile(key, p)
t = np.percentile(tgt, p)
print("percentiles (ohm.m) P5 P50 P95")
print(f"key well {k[0]:7.2f} {k[1]:7.2f} {k[2]:7.2f}")
print(f"second well {t[0]:7.2f} {t[1]:7.2f} {t[2]:7.2f}")
print(f"ratio key/second {k[0] / t[0]:7.2f} {k[1] / t[1]:7.2f} {k[2] / t[2]:7.2f}")
# Log-space shift: one multiplicative factor from the medians
factor = 10 ** (np.log10(k[1]) - np.log10(t[1]))
print(f"\nlog-space shift = x {factor:.2f}")
# Log-space two-point map (a power law through the P5 and P95 anchors)
s = (np.log10(k[2]) - np.log10(k[0])) / (np.log10(t[2]) - np.log10(t[0]))
two_log = lambda x: k[0] * (x / t[0]) ** s
print(f"log-space two-point exponent s = {s:.3f}")
# Linear-space two-point map
two_lin = lambda x: k[0] + (x - t[0]) * (k[2] - k[0]) / (t[2] - t[0])
print(f"\n{'second well':>12} {'correct':>9} {'x factor':>9} {'log 2-pt':>9} {'lin 2-pt':>9}")
for x in (0.2, 1.0, 2.0, 20.0, 200.0, 2000.0):
print(f"{x:12.1f} {1.5 * x:9.2f} {x * factor:9.2f} {two_log(x):9.2f} {two_lin(x):9.2f}")
Output
percentiles (ohm.m) P5 P50 P95
key well 2.23 3.83 39.63
second well 1.54 2.56 28.45
ratio key/second 1.45 1.50 1.39
log-space shift = x 1.50
log-space two-point exponent s = 0.986
second well correct x factor log 2-pt lin 2-pt
0.2 0.30 0.30 0.30 0.37
1.0 1.50 1.50 1.46 1.48
2.0 3.00 3.00 2.89 2.87
20.0 30.00 29.95 27.99 27.89
200.0 300.00 299.52 271.16 278.01
2000.0 3000.00 2995.22 2626.58 2779.29
Assumptions and limitations
- The difference between the wells is a calibration or environmental difference, multiplicative in nature, and not a difference in the formation.
- The reference interval is water-wet, free of hydrocarbons and of the same invasion state in both wells.
- The deep resistivity measures the same volume in both wells. Different tool types and different vertical resolutions are not a normalization problem.
- Resistivity is positive and the picks are positive: log10 is undefined for zero or negative values, so clean the curve first.
- Normalization is applied before the resistivity is used to compute saturation or porosity.
QC checks
- Plot normalized resistivity on a log axis against the key well in the reference interval. The histograms should overlay.
- The factor is plausible: a log-space shift far from 1 (more than a factor of about 2, as a rule of thumb) usually means the wrong interval or a tool difference that should be handled otherwise.
- The exponent of a two-point map is close to 1. A value far from 1 means the wells differ by different factors at low and high resistivity, which is rarely calibration.
- A water-bearing zone with a known Rw in each well gives about the same water resistivity (Rwa) after normalization.
- The reservoir resistivity itself is not forced to match the key well: normalizing in a reservoir interval would erase real differences in saturation.
Going Deeper
Resistivity is the standard case where the choice of scale matters. Because it is the ratio of voltage to current, a calibration error scales the reading, and because the formation resistivity ranges over orders of magnitude, equal absolute errors mean very different things at 0.5 and 500 ohm·m. Working in log space turns the multiplicative error into an additive one and makes the shift-and-scale machinery of the other pages apply unchanged. Many projects do not normalize resistivity at all, and deal with differences between wells through environmental corrections and the choice of Rw and tool type. The cases where normalization is defensible are a consistent tool and processing across wells with a known calibration drift or a set of old logs recorded with a different convention.
References
- Shier, D.E., 2004. Well log normalization: methods and guidelines. Petrophysics, 45(3), 268–280.
Python reference implementation
Python reference implementation
The Python reference implementation is available to registered users with a verified email address. Register or sign in to view it.