2 title: 'Week 6 problem set: Worked solutions'
3 subtitle: "Statistics and statistical programming \nNorthwestern University \nMTS 525"
9 ```{r setup, include=FALSE}
10 knitr::opts_chunk$set(echo = TRUE, messages = F)
13 ## Programming Questions
15 Note that Jeremy created this solution set with some code that uses functions drawn from the `tidyverse`. Wherever possible, we have also provided solution code using base R functions or alternatives since the course has not really provided an introduction to the tidyverse.
19 First we import the data.
22 raw_df = read.csv("/tmp/owan03.csv") # Note that I saved the file as a CSV for importing to R
28 Let's organize the data. We want this in "long" format where the survival times in weeks for each of the three dosage levels are all arranged in a single column and another variable labels the dosage level. There are (surprise!) many ways to do this. Here are two examples using a function called `melt()` from a library called `reshape` and another function called `gather()` from the `tidyverse` library. Note that you'll need to install the respective library and load it before you can call either function!
35 colnames(raw_df) <- c("None", "Low", "Medium","High")
37 # Here's a version using "melt"
38 d <- melt(raw_df, na.rm=TRUE)
39 names(d) <- c("dose", "weeks_alive")
41 # "gather" similarly takes all of the columns from the dataframe and uses them as keys, with the value as the value from that # cell. This gives us a "long" dataframe
42 df <- gather(raw_df, dose, weeks_alive)
43 # We want to treat dose as a factor, so we can group by it easier. Specifying the levels helps with labels later on.
44 df$dose <- factor(df$dose, levels=c("None", "Low", "Medium", "High"))
46 df <- df[complete.cases(df),]
48 # Uncomment this to see that the results are the same:
54 Now we're going to calculate summary statistics and create some visualizations
57 # First, using the tapply function
58 tapply(df$weeks_alive, df$dose, summary)
60 # Alternative way to do this using tidyverse "group_by" function:
62 df %>% group_by(dose) %>% summarize_all(c('min','max','mean', 'IQR'))
66 When it comes to visualizations, we definitely want to use ggplot. We have lots of options for what to do.
72 h_plot <- ggplot(data=df, aes(x=weeks_alive, fill = dose)) + geom_histogram(position = 'dodge', bins = 5)
75 # In this case, faceted histograms is probably better
76 h_facet <- ggplot(data=df, aes(x=weeks_alive)) + geom_histogram(bins = 5) + facet_grid(~dose)
79 # Even easier to compare if we flip the coordinates (rotate the axes)
82 # Density plots. Note that setting a value <1 for "alpha" makes the fill more transparent
83 d_plot <- ggplot(data=df, aes(x=weeks_alive, fill = dose)) + geom_density(alpha = .2)
87 box_plot <- ggplot(data=df, aes(y=weeks_alive, x = dose)) + geom_boxplot()
90 # Jeremy's favorite - ridgeline plots
92 # install.packages('ggridges')
95 ridge_plot <- ggplot(data=df, aes(x=weeks_alive, y = dose)) + geom_density_ridges(jittered_points = T, fill = 'orange')
98 # add a fancy minimalist theme to make it prettier:
99 ridge_plot + theme_minimal()
103 A two sample t-test assumes independence and normality. An ANOVA assumes independence, normality, and equal variance. It's a bit tough to tell, but the overall assumption of equal variance seems reasonable. Normality is a bit of a hard sell within groups or overall. Nevertheless, most analysts would march ahead with the analysis despite these violations of assumptions. We can discuss how you might think and talk about this in class.
113 ANOVA! Remember that we have to call `summary()` to see the ANOVA table:
116 summary(aov(weeks_alive ~ dose, data = df))
119 This provides evidence in support of the alternative hypothesis that the group means are not equal. It seems that the dosage of Red Dye #40 has a relationship with how many weeks the mice lived.
123 T-test between None and Any, and between None and High.
126 t.test(df$weeks_alive[df$dose == 'None'], # Samples with no dose
127 df$weeks_alive[df$dose != 'None'] # Samples with any dose
130 # Or, using formula notation
131 t.test(weeks_alive ~ dose == 'None', data = df)
133 # T-test between None and High
134 t.test(df$weeks_alive[df$dose == 'None'], # Samples with no dose
135 df$weeks_alive[df$dose == 'High'] # Samples with high dose
138 # Formula notation is a bit tricker. I would create a temprorary dataframe
139 df.tmp <- subset(df, subset= dose=="None" | dose=="High")
140 t.test(weeks_alive ~ dose, data = df.tmp)
144 These t-tests both support the idea that receiving a dose of RD40 reduces lifespan. However, we should not completely trust these p-values, since we are doing multiple comparisons. One option is to do a Bonferroni correction, where we only cnsider things significant if $\alpha < .05/m$ where $m$ is the number of tests. In this case, we would fail to reject the null for the second test because we would set $\alpha = .025$.
146 The Bonferroni correction is more conservative than it needs to be, ane there are other approaches; for example, the `TukeyHSD` function takes in an anova result and does post-hoc comparisons with corrections for all of the groups. The Reinhart book also provides a description of the Benjamini-Hochberg correction.
148 ## Statistical Questions
151 a) It is a sample statistic (the sample mean), because it comes from a sample. The population parameter is unknown in this case, but can be estimated from the sample statistic.
153 b) As given in the textbook, confidence intervals for proportions are equal to:
155 $$\hat{p} \pm z^* \sqrt{ \frac{\hat{p}\times(1-\hat{p})}{n}}$$
157 Where we calculate $z^*$ from the Z distribution table. For a 95% confidence interval, $z = 1.96$, so we can calculate it like this:
162 lower = .48 - 1.96 * sqrt(.48 * .52 / 1259)
164 upper = .48 + 1.96 * sqrt(.48 * .52 / 1259)
171 This means that we are 95% confident that the true proportion of Americans who support legalizing marijuana is between ~45% and ~51%.
173 c) We have a large enough sample (collected randomly) in which enough responses are drawn from each potential outcome to assume that the observations are independent and the distribution of the sample proportion is approximately normal.
175 d) The statement is **not** justified, since our confidence interval includes 50%.
179 We can use the point estimate of the poll to estimate how large a sample we would need to have a confidence interval of a given width.
181 In this case, we want the margin or error to be 2%. Using the same formula from above, this translates to: $1.96 * \sqrt{\frac{.48 * .52}{n}} = .02$
183 We can solve for $n$:
185 $$\sqrt{\frac{.48 * .52}{n}} = .02/1.96$$
186 $$\frac{.48 * .52}{n} = (.02/1.96)^2$$
187 $$n = (.48 * .52)/(.02/1.96)^2$$
190 (.48 * .52)/(.02/1.96)^2
192 So, we need a sample of at least 2,398 (since we can't survey less than a whole person).
196 The question is whether there has been a change in the proportion across two groups (the students pre- and post-class) over time. While the tools we have learned could allow you to answer that question for two groups, they assume that responses are independent. In this case, the responses are not independent because they come from the same students. You could go ahead and calculate a statistical test for difference in pooled proportions (it's just math!), but the dependence between observations violates the assumptions and means that the baseline expectations necessary to identify the hypothesis test are not met. Your test statistic will not mean what you want it to mean.
200 (a) Our hypothesis focuses on the relationship of the sample and census distributions by region:
201 $H_0$ : The sample distribution of regions follows the census distribution.
202 $H_A$ : The sample distribution of regions does not follow the census distribution.
204 Before we can calculate the test statistic we should check the conditions:
205 1. Independence: $500 < 10%$ of US population, and the sample is random, hence we can assume that one individual in the sample is independent of another.
206 2. Sample size: The expected counts can be calculated as follows:
207 $$E N E = 500 × 0.18 = 90$$
208 $$E N C = 500 × 0.22 = 110$$
209 $$E S = 500 × 0.37 = 185$$
210 $$E W = 500 × 0.23 = 115$$
212 All expected counts are greater than 5 (which meets the rule of thumb re: empty "cells" in the table).
214 We can test this with a $\chi^2$ test.
217 # Manually using the expected counts and formula for chi-squared
218 chisq = (83-90)^2/90 + (121-110)^2/110 + (193-185)^2/185 + (103-115)^2/115
221 # We could then look up the chi-square distribution for 3 degrees of freedom in the book or find it in R.
222 # lower.tail=FALSE ensures that R returns the proportion of the distribution at least as large as our critical value:
223 pchisq(chisq, df=3, lower.tail=FALSE)
225 # We could also use R's chisq.test function:
226 chisq.test(x = c(83,121,193,103), p = c(.18,.22,.37,.23))
230 The p-value for this is large, meaning that we cannot reject the null hypothesis that the sample proportions do not follow the census distribution.
232 (b) Part b answers below:
233 i) We would probably want to treat opinion as the response and region as the explanatory variable, since it's unlikely that people move to a region based on their opinion (although that could be an empirical question!).
234 ii) One hypothesis is that opinions differ by region. The null hypothesis is that opinion is independent of region, while the alternative hypothesis is that there is a relationship. More formally:
235 $H_0$ : Region and opinion on direction are independent.
236 $H_A$ : Region and opinion on direction are dependent.
237 iii) We can again use a $\chi^2$ test.
239 You can do this by hand calculating the expected counts and then plugging the values into the formula for $\chi^2$ as we did above. If you do that, here are the expected counts:
259 Working through the formula for the $\chi^2$ test statistic and then calculating the p-value for 3 degrees of freedom:
262 chisq <- (29-28)^2 /28 +
272 pchisq(chisq, df=3, lower.tail=FALSE)
275 And using R's `chisq.test()` function here:
277 x <- matrix(c(29,54,44,77,62,131,36,67), nrow = 4, # this makes a matrix with 4 rows
278 byrow=T) # And this says that we've entered it row by row
281 The answers don't match exactly (because of the rounding I did in computing the expected counts), however the payoff/interpretation is the same: we cannot reject the null hypothesis of no relationship between region and direction opinoin in the sample.
283 ## Empirical Questions
287 a) The unit of analysis is the customer. The dependent variable is the type of board purchased and the independent variable is gender. Males, females, and unkown gender customers are being compared. This is a two-way test.
289 b) For this type of comparison statistical tests help to give (or take away) confidence in any observed differences across categories. Choosing a statistical test is based on the question that you want to answer and the type of data that you have available to answer it. For example, if this were numeric data (e.g., the amount of money spent on electronics for men and women) then we could choose a t-test to compare those distributions.
291 c) The null hypothesis ($H_0$) is that the board purchased is independent of the gender of the customer. The alternative hypothesis ($H_A$) is that board purchase choice is dependent on gender.
293 d) A $\chi^2$ test found statistically significant evidence that board purchase behavior differs by gender. This difference is convincing, but it does directly not tell us what the authors set out to understand, which is the difference between men and women (the test could have identified a significant difference in the number of unknown gender customers across board types). Many of these concerns are addressed in the text and with additional tests, giving increased confidence in the observed differences.
297 a) These are counts for two categorical variables, so the procedure used was a $\chi^2$ test. The null hypothesis is that whether or not a blog is governed by one person is independent of whether it is on the left or the right ideologically.
299 b) Assuming that the null hypothesis of no difference across the two groups is compelling, it would be surprising to see these results in a world where ideological orientation and blog governance have no relationship. In this respect, it makes sense to believe that this difference is likely real. Perhaps the main reason to be skeptical is the way that the data are grouped. The authors could have grouped them differently (e.g., 1-2 people, 3-4 people, and 5+ people); if the decision on how to group was made after seeing the data then we have good reason to be skeptical.
301 c) We can do this in R.
305 # First we create the dataframe
306 df = data.frame(Governance=c('Individual','Multiple', 'Individual','Multiple'),
307 Ideology = c('Left','Left','Right','Right'),
308 Count = c(13,51,27,38))
310 # We can make sure it's the same by testing the Chi-squared
311 chisq.test(matrix(df$Count, nrow=2))
313 # Using Jeremy's tidyverse code:
314 percentage_data <- df %>%
315 group_by(Ideology) %>%
316 summarize(individual_ratio = sum(Count[Governance=='Individual']) / sum(Count),
317 group_count = sum(Count))
319 shaw_benkler_plot = percentage_data %>%
320 ggplot(aes(x=Ideology, y=individual_ratio * 100)) +
321 geom_bar(stat='identity', aes(fill=c('red','blue')), show.legend=F) +
322 ylab('Percentage of Blogs') + theme_minimal()
328 If we want to add error bars, we need to calculate them (Note that ggplot could do this for us if we had raw data - always share your data!).
330 For our purposes here, Jeremy decided to use confidence intervals. The standard error is another reasonable choice. Either way, ggplot has a `geom_errorbar` layer that is very useful.
332 Remember that for a binomial distribution (we can consider individual/non-individual as binomial), confidence intervals are
333 $\hat{p} \pm z^* \sqrt{\frac{\hat{p}~(1-\hat{p})}{n}}$
336 ci_95 = 1.96 * sqrt(percentage_data$individual_ratio * (1 - percentage_data$individual_ratio)/percentage_data$group_count)
338 shaw_benkler_plot + geom_errorbar(aes(ymin=(individual_ratio-ci_95)*100, ymax=(individual_ratio + ci_95)*100),
345 The error bars do overlap in this case, indicating that the true population proportions may not be as far apart as our point estimates suggest. Note that this is not the same as the hypothesis test.
347 d) On the one hand, we don't need to worry about the base rate fallacy because the sizes of both groups are about the same and the paper does not abuse the evidence too egregiously. The base rate fallacy would likely come into play, however, in the ways that the results are (mis)represented. For example, you might imagine some news coverage looking at these results and claiming something (totally wrong!) like "Harvard study finds right wing blogs more than twice as likely to be solo affairs." This is taking a relationship between the sample proportions ($\hat{p}$ in the language of our textbook) and converting that into a statement about the relationship between population proportions ($p$). That would be a mess.
349 Another way in which the base rate fallacy could play a role in this paper, however, concerns the presence of multiple comparisons. The authors conducted numerous statistical tests (indeed, one of the authors seems to recall that some of the tests were not even reported in the paper <Gasp!>) and they make no effort to address the baseline probability of false positives.
351 In any case, the point here is that the statistical tests reported in the paper may not mean exactly what the authors said they did in the context of the publication. That may or may not change the validity of the results, but it should inspire us all to do better statistical analysis!