Much has been written about social class differences in the heritability of cognitive ability, little about racial and ethnic differences. I will leave a review of the issue, a discussion of our meta-analytic results, and a report of our technically complex CNLSY ACE x race/ethnicity analysis to my more loquacious (and apt) colleagues. Here I present results based on the (effectively) small NLSY79 kinship sample.

Method: We utilized the NLSYlinks r-forge program to conduct a biometric analysis of the NLSY79 AFQT score variance. Regarding measure, we used the 2006 renormed AFQT scores with the effects of sex and birth year (plus month) statistically removed. Regarding method, we used structural equation modeling and Defries-Fulker analysis. The r-Forge syntax is provided below. Our data file is available upon request. (Email: J122177(at)hotmail.com.)

Results: The results are shown below. The heritability of AFQT scores was no lower in the Black American population than in the White. The heritability was zero in the Hispanic American population, though. The Hispanic results need to be read with caution as the Hispanic non-Full sibling sample size was minute at 43 pairs. ACE estimates, of course, are based on the differences in intraclass correlations between different kinship classes (e.g., full-sib/half-sib); the reliability of these estimates is dependent on the sample sizes of these different classes.

Generally, regarding African and European Americans, the NLSY79 results are consistent with the previous findings which show no consistent race x ACE interaction. The (effectively) small sample sizes preclude strong conclusions, though. One might modify the analysis in a number of ways. Regarding heritability in the Hispanic population, one might look at less culturally loaded measures such as the ASVAB’s object assembly or coding subtests to get a sense if the zero heritability is due to cultural bias rather than sampling error. For reference, the AFQT scores were calculated based on the ASVAB’s arithmetic reasoning, word knowledge, paragraph comprehension, and numerical operations subtests. Again, the sample sizes are such that more detailed analysis would probably be of little worth.

More informative results will be presented in the future.

RExACE

r-Forge Code for “White”; for Black and Hispanic change “dsOutcomes$Race==3″ in ” dsOutcomesSubset <- dsOutcomes[dsOutcomes$Race==3, ]" to 2 and 1, respectively.

White SEM

rm(list=ls(all=TRUE))
library(NlsyLinks)
ReadCsvNlsy79Gen1 <- function( filePath, dsExtract=read.csv(filePath) ) {
if( !("R0000100" %in% colnames(dsExtract)) ) stop("The NLSY variable 'R0000100' should be present, but was not found.")
colnames(dsExtract)[colnames(dsExtract)=='R0000100'] <- "SubjectID"
dsExtract$Generation <- 1
dsExtract$SubjectTag <- CreateSubjectTag(dsExtract$SubjectID, dsExtract$Generation)
dsWithExtended <- SubjectDetails79[SubjectDetails79$Generation==1, c("SubjectTag", "ExtendedID")]
ds <- merge(x=dsExtract, y=dsWithExtended, by="SubjectTag", all.x=TRUE, all.y=FALSE)
firstColumns <- c("SubjectTag", "SubjectID", "ExtendedID", "Generation")
remaining <- setdiff(colnames(ds), firstColumns)
ds <- ds[, c(firstColumns, remaining)]
return( ds )
}
filePathOutcomes <- 'c:\Users\John\Desktop\AFQTRACEBIRTH\AFQTRACEBIRTH.csv'
dsOutcomes <- ReadCsvNlsy79Gen1(filePathOutcomes)
dsOutcomes <- RenameNlsyColumn(dsOutcomes, "R0214700", "Race")
dsOutcomesSubset <- dsOutcomes
dsOutcomesSubset <- dsOutcomes[dsOutcomes$Race==3, ]
summary(dsOutcomes)
dsLinks <- Links79PairExpanded
dsSingle <- CreatePairLinksSingleEntered (outcomeDataset=dsOutcomesSubset, linksPairDataset=dsLinks, outcomeNames= c('AFQTREGYMDUMMY'))
oName_1 <-"AFQTREGYMDUMMY_1" #Stands for Outcome1
oName_2 <-"AFQTREGYMDUMMY_2" #Stands for Outcome2
(dsGroupSummary <-RGroupSummary(dsSingle, oName_1, oName_2))
dsGroupSummary
dsClean <-CleanSemAceDataset(dsDirty=dsSingle, dsGroupSummary, oName_1, oName_2)
(ace <-AceLavaanGroup(dsClean))
ace

White DF

rm(list=ls(all=TRUE))
library(NlsyLinks)
ReadCsvNlsy79Gen1 <- function( filePath, dsExtract=read.csv(filePath) ) {
if( !("R0000100" %in% colnames(dsExtract)) ) stop("The NLSY variable 'R0000100' should be present, but was not found.")
colnames(dsExtract)[colnames(dsExtract)=='R0000100'] <- "SubjectID"
dsExtract$Generation <- 1
dsExtract$SubjectTag <- CreateSubjectTag(dsExtract$SubjectID, dsExtract$Generation)
dsWithExtended <- SubjectDetails79[SubjectDetails79$Generation==1, c("SubjectTag", "ExtendedID")]
ds <- merge(x=dsExtract, y=dsWithExtended, by="SubjectTag", all.x=TRUE, all.y=FALSE)
firstColumns <- c("SubjectTag", "SubjectID", "ExtendedID", "Generation")
remaining <- setdiff(colnames(ds), firstColumns)
ds <- ds[, c(firstColumns, remaining)]
return( ds )
}
filePathOutcomes <- 'c:\Users\John\Desktop\AFQTRACEBIRTH\AFQTRACEBIRTH.csv'
dsOutcomes <- ReadCsvNlsy79Gen1(filePathOutcomes)
dsOutcomes <- RenameNlsyColumn(dsOutcomes, "R0214700", "Race")
dsOutcomesSubset <- dsOutcomes
dsOutcomesSubset <- dsOutcomes[dsOutcomes$Race==3, ]
summary(dsOutcomes)
dsLinks <- Links79PairExpanded
dsLinks <- Links79PairExpanded
dsDouble <- CreatePairLinksDoubleEntered(outcomeDataset=dsOutcomesSubset, linksPairDataset=dsLinks, outcomeNames=c("AFQTREGYMDUMMY"))
ace <- AceUnivariate( method="DeFriesFulkerMethod3", dataSet=dsDouble, oName_1="AFQTREGYMDUMMY_1", oName_2="AFQTREGYMDUMMY_2" )
ace