# Taleb is wrong about IQ

Investigation of Talebs claims about IQ using real data.

Jonatan Pallesen
06-16-2019

### Introduction

In this post I look into the document by Nassim Taleb: IQ is largely a pseudoscientific swindle. Most of the document is just a rant, but he does make some quantitative claims, which is good. I investigate the veracity of these claims using real data.

[Edit: The quotes below were taken verbatim from Taleb’s document as it was written when this post was uploaded.]

### Variance explained by IQ

Claim:

[IQ] explains at best between 2 and 13% of the performance in some tasks

I already have prepared the WLS data set here, and it has a good IQ test, so I will use that. Lets look at the regression of grades on IQ.

imports

library(pacman)

source('../../src/extra.R', echo = F, encoding="utf-8")

set.seed(1)

regression

filter(rtype == "g") %>%

Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0053 0.00818 -0.648 0.517
iq_std 0.595 0.00816 73 0
Fitting linear model: grades_std ~ iq_std
Observations Residual Std. Error $$R^2$$ Adjusted $$R^2$$
9624 0.802 0.356 0.356

The adjusted R2 is 0.356, so IQ explains ~35% of the variance of grades in this data set. Taleb defenders may say that things such as school grades don’t matter in real life. But whatever your position on this, the situation is that he made a specific claim about how much IQ explains at best, which was off by a large factor.

### IQ selection vs random selection

Claim:

Turns out IQ beats random selection in the best of applications by less than 6%

He hasn’t specified what exactly he means by this. But I’m pretty sure he is thinking of a comparison like the one he talks about in this tweet:

I create two normally distributed variables, with correlation 0.5.

create variables

n <- 10**8

X0 <- MASS::mvrnorm(
n=n,
mu = c(0,0),
Sigma = matrix(c(1,0.5,0.5,1),
2,2))

df <- tibble(IQ = X0[,1],
performance = X0[,2])

df %>% summarise(
cor = cor(IQ, performance),
n = n(),
mean_IQ = mean(IQ),
sd_IQ = sd(IQ),
mean_performance = mean(performance),
sd_performance = sd(performance)
)
cor n mean_IQ sd_IQ mean_performance sd_performance
0.5 1e+08 3.16e-06 1 0.000102 1

The probability of hiring an employee with above average performance, if you hire an employee with above average IQ is:

above_average_iq <- df %>% filter(IQ > 0)

nrow(above_average_iq %>% filter(performance > 0)) / nrow(above_average_iq)

0.667

The probability if there was 0 correlation is of course 0.5. So using IQ as a criteria beats random selection by 16.67% (as Taleb also found). This is a little more than 6%, but that is a detail. More importantly, this example is a theoretical use case where using IQ testing is not so useful. To look at something a little more realistic, let’s say a company wants to avoid people with a performance more than 2 standard deviations below the mean. (Perhaps such employees have a risk of causing large harm, which could for instance be an issue in the military.) And we again compare admitting people at random vs only taking applicants with above average IQ.

If the company admits people at random, we get this proportion of people with a performance more than 2 SD below the mean:

nrow(filter(df, performance < -2)) / n

0.0228

And if the company only takes applicants with above average IQ, we get this proportion of people with a performance more than 2 SD below the mean:

nrow(filter(above_average_iq, performance < -2)) /
nrow(above_average_iq)

0.00406

This is an improvement by a factor of:

5.6

In other words, using IQ selection criteria in this case beats random selection by more than 450%. Quite different than the claimed 6%.

### IQ and income

Claim:

There is no correlation IQ/Income above 45K

He makes this claim based on this image:

The image is from this paper, which gets its data from NLSY79. This data is also public, so we can again check for ourselves. Description of the preprocessing I perform is described here.

nlsy %>% select(iq, income) %>% drop_na() %>% count()
n
8232

The plot looks similar to the one from the paper, but somewhat different, because I use the average income values for a period of 10 years, instead of that from a single year.

plot

sc <- scale_y_continuous(
breaks = c(100000, 200000, 300000, 400000, 500000),
labels = c("$100,000", "$200,000", "$300,000", "$400,000", "$500,000") ) nlsy %>% ggplot(aes(x = iq, y = income)) + geom_point(alpha = 1, size = 0.5) + sc As in the plot used by Taleb it’s quite hard to see whats going on with all the overlying points. Reducing the transparency helps somewhat. plot with reduced transparency nlsy %>% ggplot(aes(x = iq, y = income)) + geom_point(alpha = 0.2, size = 0.5) + sc If we look at only incomes above$45.000 per year, there is still a clear correlation of about 0.3.

plot

nlsy %>% filter(income > 45000) %>%
plot_lm("iq", "income") + sc

Another way to make the relationship clearer is to plot the distribution of income for seperate IQ groups. Plotting the distribution avoids the issue of the plot becoming unclear and confusing due to overlapping points.

### Conclusion

All the claims from the article that I looked at, that can be interpreted as something specific and tested in a real data set, turned out not to be correct. If Taleb hadn’t blocked everyone who disagrees with him, perhaps he would have found out about this, and not published a post with all these incorrect claims.