In the list following c(, you would be any package you need in between quotation marks.

# List of packages
packages <- c("tidyverse", "fst", "modelsummary") # add any you need here

# Install packages if they aren't installed already
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)

# Load the packages
lapply(packages, library, character.only = TRUE)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## [[1]]
##  [1] "lubridate" "forcats"   "stringr"   "dplyr"     "purrr"     "readr"    
##  [7] "tidyr"     "tibble"    "ggplot2"   "tidyverse" "stats"     "graphics" 
## [13] "grDevices" "utils"     "datasets"  "methods"   "base"     
## 
## [[2]]
##  [1] "fst"       "lubridate" "forcats"   "stringr"   "dplyr"     "purrr"    
##  [7] "readr"     "tidyr"     "tibble"    "ggplot2"   "tidyverse" "stats"    
## [13] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"     
## 
## [[3]]
##  [1] "modelsummary" "fst"          "lubridate"    "forcats"      "stringr"     
##  [6] "dplyr"        "purrr"        "readr"        "tidyr"        "tibble"      
## [11] "ggplot2"      "tidyverse"    "stats"        "graphics"     "grDevices"   
## [16] "utils"        "datasets"     "methods"      "base"

Loading Data into R

Let’s load our data, fst style. Remember the data needs to be in the folder where you’re working from. You can enter getwd() to check your working directory.

ess <- read_fst("All-ESS-Data.fst")

Important

If you struggle to load the entire ESS dataset on your device (e.g., you get a memory error code), you can individually load the country datasets below after downloading them from the course website. Otherwise, skip this step and jump to “Subsetting”.

Remove hashtags and run the following commands to read each country dataset as specified below.

For both the homework and tutorial, you will need:

#belgium_data <- read.fst("belgium_data.fst")
#estonia_data <- read.fst("estonia_data.fst")
#france_data <- read.fst("france_data.fst")
#norway_data <- read.fst("norway_data.fst")
#ireland_data <- read.fst("ireland_data.fst")
#portugal_data <- read.fst("portugal_data.fst")
#serbia_data <- read.fst("serbia_data.fst")
#italy_data <- read.fst("italy_data.fst")

Subsetting

We will first filter to Belgium and select the “happy” variable. See details here: https://ess-search.nsd.no/en/variable/39ea4d77-af95-470e-b958-45d11d43bf5e

We will then rename the happy column variable to ‘y’ for easier referencing (i.e., y typically refers to the outcome variable) But first, we need to understand how to filter. Countries in the ESS dataset are stored in the “cntry” column (for country) under their two letter country codes. Here’s a reference: https://www23.statcan.gc.ca/imdb/p3VD.pl?Function=getVD&TVD=141329

Let’s practice creating a table of all unique entries.

unique(ess$cntry)
##  [1] "AT" "BE" "CH" "CZ" "DE" "DK" "ES" "FI" "FR" "GB" "GR" "HU" "IE" "IL" "IT"
## [16] "LU" "NL" "NO" "PL" "PT" "SE" "SI" "EE" "IS" "SK" "TR" "UA" "BG" "CY" "RU"
## [31] "HR" "LV" "RO" "LT" "AL" "XK" "ME" "RS" "MK"

BE stands for Norway. Here’s how we are going to filter to a specific value (Norway) within the cntry column and “select” our variable of interest –> happy

norway_happy <- ess %>% # note: if you work from norway_data replace "ess" with norway_data
  filter(cntry == "NO") %>% 
  select(happy)
norway_happy$y <- norway_happy$happy

table(norway_happy$y)
## 
##    0    1    2    3    4    5    6    7    8    9   10   77   88 
##   15   29   59  163  238  730  817 2617 5235 3796 2344   12   10
# need to remove 77, 88, 99 or else will alter results. See data portal for what they represent (e.g. DK, Refusal, etc.)

# Recode values 77 through 99 to NA
norway_happy$y[norway_happy$y %in% 77:99] <- NA

# checking again
table(norway_happy$y)
## 
##    0    1    2    3    4    5    6    7    8    9   10 
##   15   29   59  163  238  730  817 2617 5235 3796 2344

Task 1 Provide code and answer.

Prompt and question: calculate the average for the variable ‘happy’ for the country of Norway. On average, based on the ESS data, who reports higher levels of happiness: Norway or Belgium?

Note: we already did it for Belgium. You just need to compare to Norway’s average, making sure to provide the code for both.

Calculating Mean and Median

First, let’s calculate the mean of the variable ‘y’ in our dataset. Then, let’s calculate the median.

mean_y <- mean(norway_happy$y, na.rm = TRUE)
cat("Mean of 'y' is:", mean_y, "\n")
## Mean of 'y' is: 7.975005

According to the ess data, 7.975005>7.737334, Norway reports higher levels of happiness. The number of mean is more bigger, means the happiness level is higher.

Task 2 Provide code and answer.

Prompt and question: what is the most common category selected, for Irish respondents, for frequency of binge drinking? The variable of interest is: alcbnge.

More info here: https://ess-search.nsd.no/en/variable/0c65116e-7481-4ca6-b1d9-f237db99a694.

Hint: need to convert numeric value entries to categories as specified in the variable information link. We did similar steps for Estonia and the climate change attitude variable.

Counting categorical variables

Ireland_ccfrequency <- ess %>%
  filter(cntry == "IE") %>%
  select(alcbnge)

Ireland_ccfrequency$y <- Ireland_ccfrequency$alcbnge

table(Ireland_ccfrequency$y)
## 
##   1   2   3   4   5   6   7   8 
##  65 650 346 417 239 641  26   6
# Recode values 6 through 8 to NA
Ireland_ccfrequency$y[Ireland_ccfrequency$y %in% 6:8] <- NA
# Converting to categories to get mode as a category instead of a number
df <- Ireland_ccfrequency %>%
  mutate(
    y_category = case_when(
      y == 1 ~ "Not at all frequency",
      y == 2 ~ "Not very frequency",
      y == 3 ~ "Somewhat frequency",
      y == 4 ~ "Very frequency",
      y == 5 ~ "Extremely frequency",
      TRUE ~ NA_character_
    ),
    y_category = fct_relevel(factor(y_category),  ### here you would put the categories in order you want them to appear or else it will appear alphabetically
                             "Not at all frequency", 
                             "Not very frequency", 
                             "Somewhat frequency", 
                             "Very frequency", 
                             "Extremely frequency")
  )

# To confirm the conversion:
table(df$y_category)
## 
## Not at all frequency   Not very frequency   Somewhat frequency 
##                   65                  650                  346 
##       Very frequency  Extremely frequency 
##                  417                  239

Based on ess data, not very frequency is most common for Ireland.

Task 3 Provide code and answer.

Prompt and question: when you use the summary() function for the variable plnftr (about planning for future or taking every each day as it comes from 0-10) for both the countries of Portugal and Serbia, what do you notice? What stands out as different when you compare the two countries (note: look up the variable information on the ESS website to help with interpretation)? Explain while referring to the output generated.

result <- ess %>%
  # Step 1: Filter for the countries of interest
  filter(cntry %in% c("RS", "PT")) %>%
  
  # Step 2: Recode 77, 88, 99 to NA for 'imueclt'
  mutate(imueclt = recode(imueclt, `77` = NA_real_, `88` = NA_real_, `99` = NA_real_)) %>%
  
  # Step 3: Compute mean by country
  group_by(cntry) %>%
  summarize(mean_imueclt = mean(imueclt, na.rm = TRUE))

print(result)
## # A tibble: 2 × 2
##   cntry mean_imueclt
##   <chr>        <dbl>
## 1 PT            5.48
## 2 RS            4.92

Use summary()function can compare the data from two countries. For example:mean, median.The difference between these two countries is Serbia have the small mean than Portugal.The difference in averages may represent a different direction for the two countries in the future.

Task 4 Provide code and answer.

Prompt and question: using the variables stfdem and gndr, answer the following: on average, who is more dissastified with democracy in Italy, men or women? Explain while referring to the output generated.

Info on variable here: https://ess.sikt.no/en/variable/query/stfdem/page/1

Italy_data <- ess %>% 
  filter(cntry == "IT")

# Convert gender and Stfdem (representing dissastified with democracy in Italy)
Italy_data <- Italy_data %>%
  mutate(
    gndr = case_when(
      gndr == 1 ~ "Male",
      gndr == 2 ~ "Female",
      .default = NA_character_
    ),
    stfdem = ifelse(stfdem %in% c(77, 88), NA, stfdem)  # Convert Stfdem values
  )
# Compute mean of stfdem by gender
means_by_gender <- Italy_data %>%
  group_by(gndr) %>% # here you are "grouping by" your second variable
  summarize(stfdem = mean(stfdem, na.rm = TRUE)) %>% # here you are summarizing your variable of interest
  drop_na()
print(means_by_gender)
## # A tibble: 2 × 2
##   gndr   stfdem
##   <chr>   <dbl>
## 1 Female   4.69
## 2 Male     4.78

As the data shows, differences in men’s and women’s satisfaction with democracymale is more dissastified with democracy in Italy.

Task 5 Provide code and answer.

Prompt: Interpret the boxplot graph of stfedu and stfhlth that we generated already: according to ESS data, would we say that the median French person is more satisfied with the education system or health services? Explain.

Change the boxplot graph: provide the code to change some of the key labels: (1) Change the title to: Boxplot of satisfaction with the state of education vs. health services; (2) Remove the x-axis label; (3) Change the y-axis label to: Satisfaction (0-10).

Hint: copy the boxplot code above and just replace or cut what is asked.

ess %>%
  filter(cntry == "FR") %>%
  # Setting values to NA
  mutate(stfedu = ifelse(stfedu %in% c(77, 88, 99), NA, stfedu),
         stfhlth = ifelse(stfhlth %in% c(77, 88, 99), NA, stfhlth)) %>%
  # Reshaping the data
  select(stfedu, stfhlth) %>%
  gather(variable, value, c(stfedu, stfhlth)) %>%
  # Creating the boxplot
  ggplot(aes( x = variable, y = value)) +
  geom_boxplot() +
  stat_boxplot(geom="errorbar",width=0.3) +
  labs(y = "Satisfaction (0-10)", x="",title = "Boxplot of satisfaction with the state of education vs. health services") +
  theme_minimal()
## Warning: Removed 364 rows containing non-finite values (`stat_boxplot()`).
## Removed 364 rows containing non-finite values (`stat_boxplot()`).