Assignment 1

Generate a population of people with potential outcomes - “truth”. The true difference in potential outcomes (i.e., the causal effect) is 1.

[Q 32] In expectation, what is the true treatment effect if we had an infinite population?

answer

# set the seed so that the answers remain the same
set.seed(12345)
# 10,000 people in the population
N <- 10000
# Normally distributed covariate X
x <- rnorm(N, mean=0, sd=1)
# Potential outcomes under control
y0 <- rnorm(N, mean=0, sd=1)
# Potential outcomes under treatment
y1 <- rnorm(N, mean=1, sd=1)

Create a single dataset with all of the variables in it

popn <- as.data.frame(cbind(x=x, y0=y0, y1=y1))
#alternatively:
#popn <- data.frame(x=x, y0=y0, y1=y1)

head(popn)
##            x         y0        y1
## 1  0.5855288  0.1612775 1.4950125
## 2  0.7094660  0.5319214 1.4750548
## 3 -0.1093033 -1.2979034 1.3136164
## 4 -0.4534972  1.2455783 1.3765260
## 5  0.6058875 -0.9916905 1.0825571
## 6 -1.8179560 -0.3181931 0.7044461
a1 <- mean(y1) - mean(y0)
a1
## [1] 1.011735

Now simulate a single randomized trial of size n=100 and set the seed so all answers are the same

set.seed(12345)
trialsample <- popn[sample(1:nrow(popn), 100, replace=FALSE),]
# Randomly assign each member of the sample to treatment or control groups
trialsample$treatment <- rbinom(100, size=1, prob=0.5)

# Take the difference in sample means as an estimate of the treatment effect
# In treatment==1 group, y(1) is actually observed, while y(0) is not. The opposite is true in the treatment==0 group
effect <- mean(trialsample$y1[trialsample$treatment==1])-mean(trialsample$y0[trialsample$treatment==0])
print(effect)
## [1] 1.014851
###alternatively
#set.seed(67890)
#trialsample <- popn[sample(1:N, 100, replace=FALSE),] #randomly select 100 people (sample without replacement, a row can only be selected once)
#trialsample$treatment <- rbinom(100, size=1, prob=0.5) # Randomly assign each member of the sample to treatment or control groups
#trialsample$y <- with(trialsample, ifelse(treatment == 1, y1, y0)) #Generate observed outcomes (y)
# Treatment effect - the difference in sample means
#effect <- with(trialsample, mean(y[treatment==1])-mean(y[treatment==0]))
#effect

Now we will repeat the hypothetical trial 500 times, drawing a new sample each time. We then examine the distribution of estimated effects.

effectestimates100 <- rep(NA, 500)
for (i in 1:500) {
  trialsample <- popn[sample(1:nrow(popn), 100, replace=FALSE),]
  # Randomly assign each member of the sample to treatment or control groups
  trialsample$treatment <- rbinom(100, size=1, prob=0.5)
  
  # Take the difference in sample means as an estimate of the treatment effect
  effectestimates100[i] <- mean(trialsample$y1[trialsample$treatment==1])-mean(trialsample$y0[trialsample$treatment==0])
}

# To have the figure show up in the RStudio interface take out the pdf() and dev.off() lines; with those lines a pdf called "Histograms-n=100.pdf" will be saved in your working directory # with the figure in it
#pdf("Histograms-n=100.pdf")
hist(effectestimates100, xlab="Effect estimates")

#dev.off()

# Print out the mean and SD of effect estimates from the trials with sample size 100 each
print(mean(effectestimates100))
## [1] 1.009713
print(sd(effectestimates100))
## [1] 0.1930373

Now still repeat 500 times for hypothetical trials, but each trial has a larger size - n=1000.

effectestimates1000 <- rep(NA, 500)
for (i in 1:500) {
  trialsample <- popn[sample(1:nrow(popn), 1000, replace=FALSE),]
  # Randomly assign each member of the sample to treatment or control groups
  trialsample$treatment <- rbinom(1000, size=1, prob=0.5)
  
  # Take the difference in sample means as an estimate of the treatment effect
  effectestimates1000[i] <- mean(trialsample$y1[trialsample$treatment==1])-mean(trialsample$y0[trialsample$treatment==0])
}

# To have the figure show up in the RStudio interface take out the pdf() and dev.off() lines
# Put both histograms together in one page and make the x-axis the same for both
#pdf("Histograms-Both.pdf")
par(mfrow=c(2,1))
#hist(effectestimates100, xlab="Effect estimates from trials of 100 people each", xlim=c(0.5, 1.5))
#hist(effectestimates1000, xlab="Effect estimates from trials of 1000 people each", xlim=c(0.5, 1.5))
#dev.off()

# Print out the mean and SD of effect estimates from the trials with sample size 1000 each
print(mean(effectestimates1000))
## [1] 1.008886
print(sd(effectestimates1000))
## [1] 0.061703

Based on the simulations you ran above:

#If we do a trial of size n=100 what is the chance we will get an estimated effect that is larger than 1.1 or smaller than 0.9 (i.e., more than 0.1 off from 1?) 
print(mean(ifelse(effectestimates100 < 0.9 | effectestimates100 > 1.1, 1, 0)))
## [1] 0.608
#If we do a trial of size n=1000, what is the chance we will get an estimated effect that is larger than 1.1 or smaller than 0.9 (i.e., more than 0.1 off from 1?)
mean(ifelse(effectestimates1000 < 0.9 | effectestimates1000 > 1.1, 1, 0))
## [1] 0.11
LS0tCnRpdGxlOiAnQ2F1c2FsIEluZmVyZW5jZSBpbiBNZWRpY2luZSBhbmQgUHVibGljIEhlYWx0aCAoMTQwLjY0NCkgLSBBc3NpZ25tZW50IDEgY29kZScKYXV0aG9yOiAiTm9haCBHcmVpZmVyIGFuZCBDYXJseSBMdXB0b24tU21pdGgiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgojIEFzc2lnbm1lbnQgMQoKR2VuZXJhdGUgYSBwb3B1bGF0aW9uIG9mIHBlb3BsZSB3aXRoIHBvdGVudGlhbCBvdXRjb21lcyAtICJ0cnV0aCIuIFRoZSB0cnVlIGRpZmZlcmVuY2UgaW4gcG90ZW50aWFsIG91dGNvbWVzIChpLmUuLCB0aGUgY2F1c2FsIGVmZmVjdCkgaXMgMS4KCgo8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZjViMSI+ICoqW1EgMzJdIEluIGV4cGVjdGF0aW9uLCB3aGF0IGlzIHRoZSB0cnVlIHRyZWF0bWVudCBlZmZlY3QgaWYgd2UgaGFkIGFuIGluZmluaXRlIHBvcHVsYXRpb24/KiogPC9zcGFuPgoKPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gYW5zd2VyIDwvc3Bhbj4KCgpgYGB7cn0KIyBzZXQgdGhlIHNlZWQgc28gdGhhdCB0aGUgYW5zd2VycyByZW1haW4gdGhlIHNhbWUKc2V0LnNlZWQoMTIzNDUpCiMgMTAsMDAwIHBlb3BsZSBpbiB0aGUgcG9wdWxhdGlvbgpOIDwtIDEwMDAwCiMgTm9ybWFsbHkgZGlzdHJpYnV0ZWQgY292YXJpYXRlIFgKeCA8LSBybm9ybShOLCBtZWFuPTAsIHNkPTEpCiMgUG90ZW50aWFsIG91dGNvbWVzIHVuZGVyIGNvbnRyb2wKeTAgPC0gcm5vcm0oTiwgbWVhbj0wLCBzZD0xKQojIFBvdGVudGlhbCBvdXRjb21lcyB1bmRlciB0cmVhdG1lbnQKeTEgPC0gcm5vcm0oTiwgbWVhbj0xLCBzZD0xKQpgYGAKCkNyZWF0ZSBhIHNpbmdsZSBkYXRhc2V0IHdpdGggYWxsIG9mIHRoZSB2YXJpYWJsZXMgaW4gaXQKYGBge3J9CnBvcG4gPC0gYXMuZGF0YS5mcmFtZShjYmluZCh4PXgsIHkwPXkwLCB5MT15MSkpCiNhbHRlcm5hdGl2ZWx5OgojcG9wbiA8LSBkYXRhLmZyYW1lKHg9eCwgeTA9eTAsIHkxPXkxKQoKaGVhZChwb3BuKQoKYTEgPC0gbWVhbih5MSkgLSBtZWFuKHkwKQphMQogIApgYGAKCk5vdyBzaW11bGF0ZSBhIHNpbmdsZSByYW5kb21pemVkIHRyaWFsIG9mIHNpemUgbj0xMDAgYW5kIHNldCB0aGUgc2VlZCBzbyBhbGwgYW5zd2VycyBhcmUgdGhlIHNhbWUKYGBge3J9CnNldC5zZWVkKDEyMzQ1KQp0cmlhbHNhbXBsZSA8LSBwb3BuW3NhbXBsZSgxOm5yb3cocG9wbiksIDEwMCwgcmVwbGFjZT1GQUxTRSksXQojIFJhbmRvbWx5IGFzc2lnbiBlYWNoIG1lbWJlciBvZiB0aGUgc2FtcGxlIHRvIHRyZWF0bWVudCBvciBjb250cm9sIGdyb3Vwcwp0cmlhbHNhbXBsZSR0cmVhdG1lbnQgPC0gcmJpbm9tKDEwMCwgc2l6ZT0xLCBwcm9iPTAuNSkKCiMgVGFrZSB0aGUgZGlmZmVyZW5jZSBpbiBzYW1wbGUgbWVhbnMgYXMgYW4gZXN0aW1hdGUgb2YgdGhlIHRyZWF0bWVudCBlZmZlY3QKIyBJbiB0cmVhdG1lbnQ9PTEgZ3JvdXAsIHkoMSkgaXMgYWN0dWFsbHkgb2JzZXJ2ZWQsIHdoaWxlIHkoMCkgaXMgbm90LiBUaGUgb3Bwb3NpdGUgaXMgdHJ1ZSBpbiB0aGUgdHJlYXRtZW50PT0wIGdyb3VwCmVmZmVjdCA8LSBtZWFuKHRyaWFsc2FtcGxlJHkxW3RyaWFsc2FtcGxlJHRyZWF0bWVudD09MV0pLW1lYW4odHJpYWxzYW1wbGUkeTBbdHJpYWxzYW1wbGUkdHJlYXRtZW50PT0wXSkKcHJpbnQoZWZmZWN0KQoKIyMjYWx0ZXJuYXRpdmVseQojc2V0LnNlZWQoNjc4OTApCiN0cmlhbHNhbXBsZSA8LSBwb3BuW3NhbXBsZSgxOk4sIDEwMCwgcmVwbGFjZT1GQUxTRSksXSAjcmFuZG9tbHkgc2VsZWN0IDEwMCBwZW9wbGUgKHNhbXBsZSB3aXRob3V0IHJlcGxhY2VtZW50LCBhIHJvdyBjYW4gb25seSBiZSBzZWxlY3RlZCBvbmNlKQojdHJpYWxzYW1wbGUkdHJlYXRtZW50IDwtIHJiaW5vbSgxMDAsIHNpemU9MSwgcHJvYj0wLjUpICMgUmFuZG9tbHkgYXNzaWduIGVhY2ggbWVtYmVyIG9mIHRoZSBzYW1wbGUgdG8gdHJlYXRtZW50IG9yIGNvbnRyb2wgZ3JvdXBzCiN0cmlhbHNhbXBsZSR5IDwtIHdpdGgodHJpYWxzYW1wbGUsIGlmZWxzZSh0cmVhdG1lbnQgPT0gMSwgeTEsIHkwKSkgI0dlbmVyYXRlIG9ic2VydmVkIG91dGNvbWVzICh5KQojIFRyZWF0bWVudCBlZmZlY3QgLSB0aGUgZGlmZmVyZW5jZSBpbiBzYW1wbGUgbWVhbnMKI2VmZmVjdCA8LSB3aXRoKHRyaWFsc2FtcGxlLCBtZWFuKHlbdHJlYXRtZW50PT0xXSktbWVhbih5W3RyZWF0bWVudD09MF0pKQojZWZmZWN0CmBgYAoKTm93IHdlIHdpbGwgcmVwZWF0IHRoZSBoeXBvdGhldGljYWwgdHJpYWwgNTAwIHRpbWVzLCBkcmF3aW5nIGEgbmV3IHNhbXBsZSBlYWNoIHRpbWUuIFdlIHRoZW4gZXhhbWluZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGVzdGltYXRlZCBlZmZlY3RzLgoKYGBge3J9CmVmZmVjdGVzdGltYXRlczEwMCA8LSByZXAoTkEsIDUwMCkKZm9yIChpIGluIDE6NTAwKSB7CiAgdHJpYWxzYW1wbGUgPC0gcG9wbltzYW1wbGUoMTpucm93KHBvcG4pLCAxMDAsIHJlcGxhY2U9RkFMU0UpLF0KICAjIFJhbmRvbWx5IGFzc2lnbiBlYWNoIG1lbWJlciBvZiB0aGUgc2FtcGxlIHRvIHRyZWF0bWVudCBvciBjb250cm9sIGdyb3VwcwogIHRyaWFsc2FtcGxlJHRyZWF0bWVudCA8LSByYmlub20oMTAwLCBzaXplPTEsIHByb2I9MC41KQogIAogICMgVGFrZSB0aGUgZGlmZmVyZW5jZSBpbiBzYW1wbGUgbWVhbnMgYXMgYW4gZXN0aW1hdGUgb2YgdGhlIHRyZWF0bWVudCBlZmZlY3QKICBlZmZlY3Rlc3RpbWF0ZXMxMDBbaV0gPC0gbWVhbih0cmlhbHNhbXBsZSR5MVt0cmlhbHNhbXBsZSR0cmVhdG1lbnQ9PTFdKS1tZWFuKHRyaWFsc2FtcGxlJHkwW3RyaWFsc2FtcGxlJHRyZWF0bWVudD09MF0pCn0KCiMgVG8gaGF2ZSB0aGUgZmlndXJlIHNob3cgdXAgaW4gdGhlIFJTdHVkaW8gaW50ZXJmYWNlIHRha2Ugb3V0IHRoZSBwZGYoKSBhbmQgZGV2Lm9mZigpIGxpbmVzOyB3aXRoIHRob3NlIGxpbmVzIGEgcGRmIGNhbGxlZCAiSGlzdG9ncmFtcy1uPTEwMC5wZGYiIHdpbGwgYmUgc2F2ZWQgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSAjIHdpdGggdGhlIGZpZ3VyZSBpbiBpdAojcGRmKCJIaXN0b2dyYW1zLW49MTAwLnBkZiIpCmhpc3QoZWZmZWN0ZXN0aW1hdGVzMTAwLCB4bGFiPSJFZmZlY3QgZXN0aW1hdGVzIikKI2Rldi5vZmYoKQoKIyBQcmludCBvdXQgdGhlIG1lYW4gYW5kIFNEIG9mIGVmZmVjdCBlc3RpbWF0ZXMgZnJvbSB0aGUgdHJpYWxzIHdpdGggc2FtcGxlIHNpemUgMTAwIGVhY2gKcHJpbnQobWVhbihlZmZlY3Rlc3RpbWF0ZXMxMDApKQpwcmludChzZChlZmZlY3Rlc3RpbWF0ZXMxMDApKQpgYGAKCk5vdyBzdGlsbCByZXBlYXQgNTAwIHRpbWVzIGZvciBoeXBvdGhldGljYWwgdHJpYWxzLCBidXQgZWFjaCB0cmlhbCBoYXMgYSBsYXJnZXIgc2l6ZSAtIG49MTAwMC4KCmBgYHtyfQplZmZlY3Rlc3RpbWF0ZXMxMDAwIDwtIHJlcChOQSwgNTAwKQpmb3IgKGkgaW4gMTo1MDApIHsKICB0cmlhbHNhbXBsZSA8LSBwb3BuW3NhbXBsZSgxOm5yb3cocG9wbiksIDEwMDAsIHJlcGxhY2U9RkFMU0UpLF0KICAjIFJhbmRvbWx5IGFzc2lnbiBlYWNoIG1lbWJlciBvZiB0aGUgc2FtcGxlIHRvIHRyZWF0bWVudCBvciBjb250cm9sIGdyb3VwcwogIHRyaWFsc2FtcGxlJHRyZWF0bWVudCA8LSByYmlub20oMTAwMCwgc2l6ZT0xLCBwcm9iPTAuNSkKICAKICAjIFRha2UgdGhlIGRpZmZlcmVuY2UgaW4gc2FtcGxlIG1lYW5zIGFzIGFuIGVzdGltYXRlIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0CiAgZWZmZWN0ZXN0aW1hdGVzMTAwMFtpXSA8LSBtZWFuKHRyaWFsc2FtcGxlJHkxW3RyaWFsc2FtcGxlJHRyZWF0bWVudD09MV0pLW1lYW4odHJpYWxzYW1wbGUkeTBbdHJpYWxzYW1wbGUkdHJlYXRtZW50PT0wXSkKfQoKIyBUbyBoYXZlIHRoZSBmaWd1cmUgc2hvdyB1cCBpbiB0aGUgUlN0dWRpbyBpbnRlcmZhY2UgdGFrZSBvdXQgdGhlIHBkZigpIGFuZCBkZXYub2ZmKCkgbGluZXMKIyBQdXQgYm90aCBoaXN0b2dyYW1zIHRvZ2V0aGVyIGluIG9uZSBwYWdlIGFuZCBtYWtlIHRoZSB4LWF4aXMgdGhlIHNhbWUgZm9yIGJvdGgKI3BkZigiSGlzdG9ncmFtcy1Cb3RoLnBkZiIpCnBhcihtZnJvdz1jKDIsMSkpCiNoaXN0KGVmZmVjdGVzdGltYXRlczEwMCwgeGxhYj0iRWZmZWN0IGVzdGltYXRlcyBmcm9tIHRyaWFscyBvZiAxMDAgcGVvcGxlIGVhY2giLCB4bGltPWMoMC41LCAxLjUpKQojaGlzdChlZmZlY3Rlc3RpbWF0ZXMxMDAwLCB4bGFiPSJFZmZlY3QgZXN0aW1hdGVzIGZyb20gdHJpYWxzIG9mIDEwMDAgcGVvcGxlIGVhY2giLCB4bGltPWMoMC41LCAxLjUpKQojZGV2Lm9mZigpCgojIFByaW50IG91dCB0aGUgbWVhbiBhbmQgU0Qgb2YgZWZmZWN0IGVzdGltYXRlcyBmcm9tIHRoZSB0cmlhbHMgd2l0aCBzYW1wbGUgc2l6ZSAxMDAwIGVhY2gKcHJpbnQobWVhbihlZmZlY3Rlc3RpbWF0ZXMxMDAwKSkKcHJpbnQoc2QoZWZmZWN0ZXN0aW1hdGVzMTAwMCkpCmBgYAoKQmFzZWQgb24gdGhlIHNpbXVsYXRpb25zIHlvdSByYW4gYWJvdmU6CgpgYGB7cn0KI0lmIHdlIGRvIGEgdHJpYWwgb2Ygc2l6ZSBuPTEwMCB3aGF0IGlzIHRoZSBjaGFuY2Ugd2Ugd2lsbCBnZXQgYW4gZXN0aW1hdGVkIGVmZmVjdCB0aGF0IGlzIGxhcmdlciB0aGFuIDEuMSBvciBzbWFsbGVyIHRoYW4gMC45IChpLmUuLCBtb3JlIHRoYW4gMC4xIG9mZiBmcm9tIDE/KSAKcHJpbnQobWVhbihpZmVsc2UoZWZmZWN0ZXN0aW1hdGVzMTAwIDwgMC45IHwgZWZmZWN0ZXN0aW1hdGVzMTAwID4gMS4xLCAxLCAwKSkpCgojSWYgd2UgZG8gYSB0cmlhbCBvZiBzaXplIG49MTAwMCwgd2hhdCBpcyB0aGUgY2hhbmNlIHdlIHdpbGwgZ2V0IGFuIGVzdGltYXRlZCBlZmZlY3QgdGhhdCBpcyBsYXJnZXIgdGhhbiAxLjEgb3Igc21hbGxlciB0aGFuIDAuOSAoaS5lLiwgbW9yZSB0aGFuIDAuMSBvZmYgZnJvbSAxPykKbWVhbihpZmVsc2UoZWZmZWN0ZXN0aW1hdGVzMTAwMCA8IDAuOSB8IGVmZmVjdGVzdGltYXRlczEwMDAgPiAxLjEsIDEsIDApKQpgYGAKCg==