-
Notifications
You must be signed in to change notification settings - Fork 16
SQ2.50 Procedural Framework: Part 7c (ExtractGroup)
After completing the "Part 7b" block on each Grouped-sample sheet, Ludwig plunges straight into the process of extracting coherent populations (based on the user-specified Group Date Type), via an automated process.
A note on confusing terminology: Ludwig was in the habit of referring to analyses subdivided and 'grouped' on the basis of a common spot-prefix (i.e. the basis for the tree structure in Squid3) as 'grouped-samples', and I have largely followed that usage. These 'grouped-samples' (i.e. shared-prefix analyses) should not be conflated with the 'Group' part of the upcoming 'Extract Group' subroutine, and its components. Within each grouped-sample, 'Extract Group' refers to the identification of (the largest possible) subset population of analyses (and uncertainties) for which Group Date Type values are sufficiently similar that calculating a WtdAv for the subset population yields A probability of equivalence higher than the user-specified threshold value. So essentially, "Extract Group" is an automated "P-hacking" process undertaken within each 'grouped-sample' dataset.
Recall that for reference, SQUID 2.50 retains a master-list of Group Date Types, indexed by the integer piGrpDateType as follows:
0 = Total 206Pb/238U Age (by default, this is not available to users)
1 = 204corr 206Pb/238U Age
2 = 207corr 206Pb/238U Age
3 = 208corr 206Pb/238U Age
4 = 204corr 207Pb/206Pb Age
5 = 204corr 208Pb/232Th Age
6 = 207corr 208Pb/232Th Age
7 = 208corr 207Pb/206Pb Age
Ludwig's code starts with a simple test to make sure the population of analyses for the grouped-sample is large enough for ExtractGroup to bother with:
plHdrRw = flHeaderRow --picks up index-number of column header-row.
--Note that Lrw is the index-number of the last row of data.
If (Lrw - plHdrRw) <= 3
TooFew = TRUE --no attempt to ExtractGroup when n (population) < 4
Else
TooFew = FALSE
End If
If (TooFew = FALSE) AND (pbExtractAgeGroups = TRUE)
Set ar2 = frSr(Frw, GrpAgetypeCol, Lrw, 1 + GrpAgetypeCol)
--This defines ar2 as a 2-column array comprising the user-specified Group Date Type,
--its uncertainty (1sigma absolute), from first row to last **WITHIN** the
--'grouped-sample' population under consideration
ExtractGroup False, pdMinProb, ar2, AgeResult:=AgeVal, TypeCol:=GrpAgetypeCol
--Subroutine ExtractGroup to be documented separately
End If --(TooFew = FALSE) AND (pbExtractAgeGroups = TRUE)
2019-09-05 We have come back out of ExtractGroup, into top-level GroupThis. The next and possibly last segment of code is the following, which uses common-Pb corrected Tera-Wasserburg ratios and their 1sigma percentage errors in order to automate the calculation (with auto-rejections) of a Ludwig (1998) 'Concordia age'. In essence, this is a two-dimensional weighted mean (the mechanics of which are already described in LudwigLibrary), for which the input data is delineated via a process analogours to the recently-described subroutine FindCoherentGroup.
In SQUID 2.50, the code simply finds the 204Pb-corrected set of Tera-Wasserburg ratios (4 columns: 238U/206Pb*, its 1sigma %err, 207*/206*, and its 1sigma %err) and performs the Concordia Age calculation on those columns. In Squid3, for Prawn XML files where 208Pb has been measured (which is the vast majority of U-Th-Pb geochronology configurations), there is no reason why the following routine could/should not be repeated on the 208Pb-corrected set of Tera-Wasserburg ratios:
If (piPb46col > 0) AND (piPb76col > 0) AND (piPb6U8_totCol > 0)
--i.e. columns ["204/206"], ["207/206"] and ["Total 206Pb/238U"] all exist
FindStr "238/206*", , Col, plHdrRw --Col is the index-number of the first column
--containing "238/206*" in the header-row. In SQUID 2.50 practice, this means Col
--locates the 204corr_238U_206Pb ratio-value.
If (Col > 0) --found the Tera-Wasserburg column-set
If (AgeVal = 0) OR (AgeVal > 300) --interesting constraint, not previously known
--Presumably Ludwig believed it was too difficult to measure concordant data on
--populations with weighted mean dates between 0 Ma and 300 Ma, and that the
--Concordia Age calculation was therefore not worthwhile. I think that belief is
--contestable, and that attempting Concordia Age calculations for ALL AgeVals
--"does no harm" - if Ludwig is right, I think it is more likely that the
--calculation simply 'fails' (which is fine), rather than yielding an inaccurate
--result (which would be more of a concern... but I don't think it would happen).
ReDim inpdat[1 To 1, 1 To 5] --Ludwig commented this line:
--"If not DIMmed then sqConcAge crashes because WtdXYmean call becomes illegal"
sqConcAge TRUE --subroutine to be documented separately
End If --(AgeVal = 0) OR (AgeVal > 300); as above, consider removing this If
End If --(Col > 0)
End If (piPb46col > 0) AND (piPb76col > 0) AND (piPb6U8_totCol > 0)
As far as I can tell, this represents the final stage of end-to-end data-processing. Part 7c, which is the final 'subpart' of Procedural Framework Part 7, terminates here. And there is no Part 8.