Results

Cleaning

IPUMS

### Select Variables
IPUMS <- IPUMS0 %>% 
  select(YEAR, STATEFIP, PUMA, METAREA, SERIAL, HHWT, REGION, STATEFIP, COUNTYFIP, DENSITY, CITY, CITYPOP, PUMA, PERWT,
         HHTYPE, MORTAMT1, RENTGRS, HHINCOME, VALUEH, FAMSIZE, AGE, HCOVPUB,
         SCHOOL, EDUC, EDUCD, DEGFIELD, DEGFIELDD, EMPSTAT, EMPSTATD, CLASSWKR, CLASSWKRD,
         UHRSWORK, LOOKING, AVAILBLE, INCTOT, POVERTY, TRANTIME, RIDERS) %>% 
  filter(YEAR != 2011 & (
    
    ## St. Cloud
    (STATEFIP == 27 & PUMA == 900) |
    ## Rochester
    (STATEFIP == 27 & PUMA == 2500) |
    ## Duluth
    (STATEFIP == 27 & PUMA == 500) |
    ## Mankato
    (STATEFIP == 27 & PUMA == 2200) |
    ## Fargo
    (STATEFIP == 38 & PUMA == 500) |
    ## Grand Forks
    (STATEFIP == 38 & PUMA == 400) |
    ## Eau Claire
    (STATEFIP == 55 & PUMA == 55103) |
    ## La Crosse
    (STATEFIP == 55 & PUMA == 900) |
    ## Dubuque
    (STATEFIP == 19 & PUMA == 700) |
    ## Cedar Rapids
    (STATEFIP == 19 & PUMA == 1000)
  )) %>% 
  mutate(CITYNAME = case_when(
    (STATEFIP == 27 & PUMA == 900) ~ "St. Cloud, MN",
    (STATEFIP == 27 & PUMA == 2500) ~ "Rochester, MN",
    (STATEFIP == 27 & PUMA == 500) ~ "Duluth, MN",
    (STATEFIP == 27 & PUMA == 2200) ~ "Mankato, MN",
    (STATEFIP == 38 & PUMA == 500) ~ "Fargo, ND",
    (STATEFIP == 38 & PUMA == 400) ~ "Grand Forks, ND",
    (STATEFIP == 55 & PUMA == 55103) ~ "Eau Claire, WI",
    (STATEFIP == 55 & PUMA == 900) ~ "La Crosse, WI",
    (STATEFIP == 19 & PUMA == 700) ~ "Dubuque, IA",
    (STATEFIP == 19 & PUMA == 1000) ~ "Cedar Rapids, IA"
  ))

save(IPUMS, file = "IPUMS Data/IPUMS_Cleaned.RData")
write.csv(IPUMS, "IPUMS Data/IPUMS_Cleaned.csv")
IPUMS <- read.csv("IPUMS Data/IPUMS_Cleaned.csv")
IPUMSP <- IPUMS %>%
  mutate(
    HHINCOME  = ifelse(HHINCOME != 9999999,     HHINCOME,     NA),
    INCTOT    = ifelse(INCTOT != 9999999,       INCTOT,       NA),
    MORTAMT1  = ifelse(!MORTAMT1 %in% c(0, 1),  MORTAMT1,     NA),
    RENTGRS   = ifelse(RENTGRS != 0,            RENTGRS,      NA),
    TRANTIME  = ifelse(TRANTIME != 0,           TRANTIME,     NA),
    VALUEH    = ifelse(!VALUEH %in% c(0, 9999998, 9999999), VALUEH, NA),
    UHRSWORK  = ifelse(!UHRSWORK %in% c(0),     UHRSWORK,     NA),       
    AVAILABLE = ifelse(!AVAILBLE %in% c(0, 5),  ifelse(AVAILBLE == 4, 1, 0), NA),
    AVAILLOOK = ifelse((!AVAILBLE %in% c(0, 5) & !LOOKING %in% c(0, 3)), ifelse((AVAILBLE == 4)&(LOOKING == 2), 1, 0), NA),
    EDUC      = ifelse(EDUC != 0,               EDUC,         NA),
    EDUC2     = case_when(
      (EDUC %in% c(1, 2, 3, 4, 5))   ~ "Not Finished HS",
      (EDUC %in% c(6))               ~ "HS",
      (EDUC %in% c(7, 8, 9, 10, 11)) ~ "Some College"),
    HS        = ifelse(EDUC2 == "HS", 1, 0),
    COL       = ifelse(EDUC2 == "Some College", 1, 0)
    )

IPUMSHH <- IPUMSP[!duplicated(IPUMSP$SERIAL),] %>% 
  select(CITYNAME, YEAR, HHWT, HHINCOME, FAMSIZE, MORTAMT1, RENTGRS, VALUEH)

IPUMSP <- IPUMSP %>% 
  select(CITYNAME, YEAR, PERWT, INCTOT, TRANTIME, AGE, UHRSWORK, AVAILABLE, AVAILLOOK, HS, COL)

write.csv(IPUMSP, "IPUMSP.csv")
write.csv(IPUMSHH, "IPUMSHH.csv")

LAUS

library(readxl)
LAUS <- read_excel("Business Stats/LAUS/LAUS ssamatab1.xlsx", 
     na = "(n)", skip = 2)
LAUS0 <- LAUS %>% 
  filter(
    Year %in% rep(2012:2020),
    Area %in% c("St. Cloud, MN MSA", "Rochester, MN MSA", "Duluth, MN-WI MSA", "Mankato-North Mankato, MN MSA",
                "Fargo, ND-MN MSA", "Grand Forks, ND-MN MSA", "Eau Claire, WI MSA", 
                "La Crosse-Onalaska, WI-MN MSA", "Dubuque, IA MSA", "Cedar Rapids, IA MSA")
    )

write.csv(LAUS0, "LAUS_Cleaned.csv")

OEWS

### 2019
MSA_M2019 <- read_excel("Business Stats/OEWS/MSA_M2019_dl.xlsx",
                        sheet = "All May 2019 Data", na = c("*", "**")) %>% 
  mutate(YEAR = 2019,
         h_mean = ifelse(h_mean == "#", 100, h_mean),
         a_mean = ifelse(a_mean == "#", 208000, a_mean)) %>%
  select(YEAR, area_title, occ_title, o_group, tot_emp, 
         jobs_1000, loc_quotient, h_mean, a_mean) %>% 
  rename(AREA_NAME = area_title, 
         OCC_TITLE = occ_title, 
         OCC_GROUP = o_group, 
         TOT_EMP = tot_emp, 
         JOBS_1000 = jobs_1000, 
         'LOC QUOTIENT' = loc_quotient, 
         H_MEAN = h_mean, 
         A_MEAN = a_mean)
MSA_M2019$H_MEAN <- as.numeric(MSA_M2019$H_MEAN)
MSA_M2019$A_MEAN <- as.numeric(MSA_M2019$A_MEAN)

### Sample Selection (All Occupation Total Employment (40000, 150000))
rangeCities <- MSA_M2019 %>% 
  filter(OCC_TITLE == "All Occupations" & (TOT_EMP <= 150000 & TOT_EMP>= 40000)) %>% 
  select(AREA_NAME)
rangeCities <- rangeCities$AREA_NAME

### 2019
MSA_M2019 <- MSA_M2019 %>% 
  filter(AREA_NAME %in% rangeCities)


### 2012
MSA_M2012_dl_1_AK_IN <- read_excel("Business Stats/OEWS/MSA_M2012_dl_1_AK_IN.xls", na = c("*", "**"))
MSA_M2012_dl_2_KS_NY <- read_excel("Business Stats/OEWS/MSA_M2012_dl_2_KS_NY.xls", na = c("*", "**"))
MSA_M2012_dl_3_OH_WY <- read_excel("Business Stats/OEWS/MSA_M2012_dl_3_OH_WY.xls", na = c("*", "**"))

MSA_M2012 <- rbind(MSA_M2012_dl_1_AK_IN,
                   MSA_M2012_dl_2_KS_NY,
                   MSA_M2012_dl_3_OH_WY) %>% 
  filter(AREA_NAME %in% rangeCities) %>% 
  mutate(YEAR = 2012,
         H_MEAN = ifelse(H_MEAN == "#", 90, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 187200, A_MEAN)) %>% 
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN) 
MSA_M2012$H_MEAN <- as.numeric(MSA_M2012$H_MEAN)
MSA_M2012$A_MEAN <- as.numeric(MSA_M2012$A_MEAN)
  
rm(MSA_M2012_dl_1_AK_IN,MSA_M2012_dl_2_KS_NY,MSA_M2012_dl_3_OH_WY)

### 2013
MSA_M2013_dl_1_AK_IN <- read_excel("Business Stats/OEWS/MSA_M2013_dl_1_AK_IN.xls", na = c("*", "**"))
MSA_M2013_dl_2_KS_NY <- read_excel("Business Stats/OEWS/MSA_M2013_dl_2_KS_NY.xls", na = c("*", "**"))
MSA_M2013_dl_3_OH_WY <- read_excel("Business Stats/OEWS/MSA_M2013_dl_3_OH_WY.xls", na = c("*", "**"))

MSA_M2013 <- rbind(MSA_M2013_dl_1_AK_IN,
                   MSA_M2013_dl_2_KS_NY,
                   MSA_M2013_dl_3_OH_WY) %>%
  filter(AREA_NAME %in% rangeCities) %>%
  mutate(YEAR = 2013,
         H_MEAN = ifelse(H_MEAN == "#", 90, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 187200, A_MEAN)) %>%
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN)
MSA_M2013$H_MEAN <- as.numeric(MSA_M2013$H_MEAN)
MSA_M2013$A_MEAN <- as.numeric(MSA_M2013$A_MEAN)

rm(MSA_M2013_dl_1_AK_IN,MSA_M2013_dl_2_KS_NY,MSA_M2013_dl_3_OH_WY)

### 2014
MSA_M2014 <- read_excel("Business Stats/OEWS/MSA_M2014_dl.xlsx", na = c("*", "**")) %>% 
  filter(AREA_NAME %in% rangeCities) %>%
  mutate(YEAR = 2014,
         H_MEAN = ifelse(H_MEAN == "#", 90, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 187200, A_MEAN)) %>%
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN)
MSA_M2014$H_MEAN <- as.numeric(MSA_M2014$H_MEAN)
MSA_M2014$A_MEAN <- as.numeric(MSA_M2014$A_MEAN)

### 2015
MSA_M2015 <- read_excel("Business Stats/OEWS/MSA_M2015_dl.xlsx", na = c("*", "**")) %>% 
  filter(AREA_NAME %in% rangeCities) %>%
  mutate(YEAR = 2015,
         H_MEAN = ifelse(H_MEAN == "#", 90, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 187200, A_MEAN)) %>%
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN)
MSA_M2015$H_MEAN <- as.numeric(MSA_M2015$H_MEAN)
MSA_M2015$A_MEAN <- as.numeric(MSA_M2015$A_MEAN)

### 2016
MSA_M2016 <- read_excel("Business Stats/OEWS/MSA_M2016_dl.xlsx", na = c("*", "**")) %>%
  filter(AREA_NAME %in% rangeCities) %>%
  mutate(YEAR = 2016,
         H_MEAN = ifelse(H_MEAN == "#", 100, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 208000, A_MEAN)) %>%
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN)
MSA_M2016$H_MEAN <- as.numeric(MSA_M2016$H_MEAN)
MSA_M2016$A_MEAN <- as.numeric(MSA_M2016$A_MEAN)

### 2017
MSA_M2017 <- read_excel("Business Stats/OEWS/MSA_M2017_dl.xlsx", na = c("*", "**")) %>% 
  filter(AREA_NAME %in% rangeCities) %>%
  mutate(YEAR = 2017,
         H_MEAN = ifelse(H_MEAN == "#", 100, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 208000, A_MEAN)) %>%
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN)
MSA_M2017$H_MEAN <- as.numeric(MSA_M2017$H_MEAN)
MSA_M2017$A_MEAN <- as.numeric(MSA_M2017$A_MEAN)

### 2018
MSA_M2018 <- read_excel("Business Stats/OEWS/MSA_M2018_dl.xlsx", na = c("*", "**")) %>% 
  filter(AREA_NAME %in% rangeCities) %>%
  mutate(YEAR = 2018,
         H_MEAN = ifelse(H_MEAN == "#", 100, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 208000, A_MEAN)) %>%
  select(YEAR, AREA_NAME, OCC_TITLE, OCC_GROUP, TOT_EMP, 
         JOBS_1000, 'LOC QUOTIENT', H_MEAN, A_MEAN)
MSA_M2018$H_MEAN <- as.numeric(MSA_M2018$H_MEAN)
MSA_M2018$A_MEAN <- as.numeric(MSA_M2018$A_MEAN)

### 2020
MSA_M2020 <- read_excel("Business Stats/OEWS/MSA_M2020_dl.xlsx", 
                        sheet = "MSA_M2020_dl", na = c("*", "**")) %>% 
  mutate(YEAR = 2020,
         H_MEAN = ifelse(H_MEAN == "#", 100, H_MEAN),
         A_MEAN = ifelse(A_MEAN == "#", 208000, A_MEAN)) %>%
  select(YEAR, AREA_TITLE, OCC_TITLE, O_GROUP, TOT_EMP, 
         JOBS_1000, LOC_QUOTIENT, H_MEAN, A_MEAN) %>% 
  rename(AREA_NAME = AREA_TITLE,
         OCC_GROUP = O_GROUP, 
         'LOC QUOTIENT' = LOC_QUOTIENT) %>% 
  filter(AREA_NAME %in% rangeCities)
MSA_M2020$H_MEAN <- as.numeric(MSA_M2020$H_MEAN)
MSA_M2020$A_MEAN <- as.numeric(MSA_M2020$A_MEAN)


OEWS_Cleaned <- rbind(MSA_M2012, MSA_M2013, MSA_M2014, MSA_M2015, MSA_M2016, 
                      MSA_M2017, MSA_M2018, MSA_M2019, MSA_M2020)
rm(MSA_M2012, MSA_M2013, MSA_M2014, MSA_M2015, MSA_M2016, 
   MSA_M2017, MSA_M2018, MSA_M2019, MSA_M2020)

write.csv(OEWS_Cleaned, "OEWS_Cleaned.csv")

IPUMS

Income

## Household Income
leveneTest(HHINCOME ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  4.8431 1.806e-06 ***
##       4679                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(HHINCOME ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  6.3141 6.183e-09 ***
##       4932                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(HHINCOME ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  8.5678 7.685e-13 ***
##       5084                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSHHwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$HHINCOME, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSHHwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$HHINCOME, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSHHwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$HHINCOME, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Rochester, MN +1* +1* +1*
Fargo, ND +2* +2* +2*
Eau Claire, WI +7 -9* +3*
La Crosse, WI +6 +3* +4*
Duluth, MN -8* +6 +5
Dubuque, IA +4* +4* +6
Grand Forks, ND -9* -8 -7
Cedar Rapids, IA +3* +5* -8*
Mankato, MN +5* -7 -9*
rm(a, b, City, t2017, t2018, t2019)


## Personal Income
leveneTest(INCTOT ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  7.3962 7.737e-11 ***
##       11201                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(INCTOT ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  11.483 < 2.2e-16 ***
##       11154                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(INCTOT ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  11.172 < 2.2e-16 ***
##       11294                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSPwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$INCTOT, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSPwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$INCTOT, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSPwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$INCTOT, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Rochester, MN +1* +1* +1*
Fargo, ND +2* +2* +2*
Grand Forks, ND +6 +6* +3*
Eau Claire, WI -9* -9* +4*
Duluth, MN -8* -7* +5*
La Crosse, WI +7 +3* +6*
Dubuque, IA +4* +4* +7*
Cedar Rapids, IA +3* +5* +8*
Mankato, MN +5 -8* -9*
rm(a, b, City, t2017, t2018, t2019)

Average Family Size

leveneTest(FAMSIZE ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value  Pr(>F)  
## group    9  1.9774 0.03781 *
##       5636                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(FAMSIZE ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value Pr(>F)
## group    9  1.0151  0.425
##       5702
leveneTest(FAMSIZE ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value Pr(>F)
## group    9  1.3527 0.2039
##       5869
b <- as.data.frame(TukeyHSD(aov(FAMSIZE ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2017)))$CITYNAME)
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

b <- as.data.frame(TukeyHSD(aov(FAMSIZE ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2018)))$CITYNAME)
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

b <- as.data.frame(TukeyHSD(aov(FAMSIZE ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2019)))$CITYNAME)
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Rochester, MN +1 -2 -1
Cedar Rapids, IA +4 -4 -2
Dubuque, IA +2 -1 -3
Eau Claire, WI -5 -6 -4
Mankato, MN -7 -5 -5
Grand Forks, ND -8* -8* -6*
Fargo, ND +3 -3 -7*
La Crosse, WI -6 -7 -8*
Duluth, MN -9* -9* -9*
rm(b, City, t2017, t2018, t2019)

Average First Mortgage Payment

leveneTest(MORTAMT1 ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  4.9098 1.526e-06 ***
##       2181                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(MORTAMT1 ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  5.6341 9.809e-08 ***
##       2226                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(MORTAMT1 ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  4.9282 1.424e-06 ***
##       2177                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSHHwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$MORTAMT1, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSHHwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$MORTAMT1, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSHHwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$MORTAMT1, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Rochester, MN +1* +1* +1*
Fargo, ND +2* +2* +2*
Grand Forks, ND -9* -5* -3*
Duluth, MN -6* -6* -4*
Cedar Rapids, IA -5* -4* -5*
La Crosse, WI +3* -7* -6*
Eau Claire, WI -7* -8* -7*
Mankato, MN +4 -3 -8*
Dubuque, IA -8* -9* -9*
rm(a, b, City, t2017, t2018, t2019)

Average Gross Rent

leveneTest(RENTGRS ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value   Pr(>F)   
## group    9  2.5949 0.005826 **
##       1021                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(RENTGRS ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9   4.032 4.302e-05 ***
##       1065                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(RENTGRS ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value   Pr(>F)   
## group    9  2.6123 0.005487 **
##       1082                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSHHwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$RENTGRS, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSHHwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$RENTGRS, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSHHwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$RENTGRS, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Duluth, MN +3* +3* +1*
Rochester, MN +1* +1* +2*
Mankato, MN +2* +5* +3
Fargo, ND +5* +7* +4*
Grand Forks, ND -9* +4* +5
La Crosse, WI +4* +2* -6
Eau Claire, WI -8 +6* -7*
Cedar Rapids, IA +7* -9* -8*
Dubuque, IA +6* -8* -9*
rm(a, b, City, t2017, t2018, t2019)

Average Travel Time to Work

leveneTest(TRANTIME ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##         Df F value    Pr(>F)    
## group    9  6.1083 1.343e-08 ***
##       6647                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(TRANTIME ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##         Df F value    Pr(>F)    
## group    9  8.9086 1.825e-13 ***
##       6578                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(TRANTIME ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##         Df F value    Pr(>F)    
## group    9  5.4434 1.782e-07 ***
##       6585                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSPwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$TRANTIME, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSPwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$TRANTIME, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSPwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$TRANTIME, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Cedar Rapids, IA -5* -6* -1*
Dubuque, IA -3* -1* -2*
Eau Claire, WI -4* -2* -3*
Rochester, MN -6* -3* -4*
Fargo, ND -8* -9* -5*
La Crosse, WI -7* -7* -6*
Mankato, MN -1* -4* -7*
Duluth, MN -2* -5* -8*
Grand Forks, ND -9* -8* -9*
rm(a, b, City, t2017, t2018, t2019)

Average House Value

leveneTest(VALUEH ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  4.8027 2.149e-06 ***
##       3585                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(VALUEH ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  6.8138 9.036e-10 ***
##       3782                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(VALUEH ~ CITYNAME, weights = HHWT, data = filter(IPUMSHH, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: HHWT)
##         Df F value    Pr(>F)    
## group    9  6.2354 8.682e-09 ***
##       3920                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSHHwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$VALUEH, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSHHwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$VALUEH, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSHHwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$VALUEH, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Rochester, MN +1* +1* +1*
Fargo, ND +2* +2* +2*
Eau Claire, WI -5* -5* -3*
La Crosse, WI -3 -4* -4*
Duluth, MN -6* -3* -5*
Mankato, MN -4* -7* -6*
Cedar Rapids, IA -8* -9* -7*
Grand Forks, ND -9* -8* -8*
Dubuque, IA -7* -6* -9*
rm(a, b, City, t2017, t2018, t2019)

Average Age

leveneTest(AGE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  4.0349 3.543e-05 ***
##       13707                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(AGE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value  Pr(>F)  
## group     9  2.2017 0.01915 *
##       13513                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(AGE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9   3.966 4.561e-05 ***
##       13642                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSPwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$AGE, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSPwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$AGE, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSPwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$AGE, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Dubuque, IA +1* +1* +1*
Rochester, MN +4* +5* +2*
Cedar Rapids, IA +5* +4* +3*
Duluth, MN +7* +2* +4*
Eau Claire, WI +2* +3* +5*
La Crosse, WI +3* +6* +6*
Grand Forks, ND +6* +7* +7*
Mankato, MN -8 -8 +8
Fargo, ND -9* -9* -9*
rm(a, b, City, t2017, t2018, t2019)

Average Usual Hours Per Week

leveneTest(UHRSWORK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##         Df F value   Pr(>F)   
## group    9  2.8449 0.002397 **
##       7968                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(UHRSWORK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##         Df F value    Pr(>F)    
## group    9  5.4021 2.067e-07 ***
##       7910                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(UHRSWORK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##         Df F value    Pr(>F)    
## group    9  3.8803 6.304e-05 ***
##       7881                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSPwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$UHRSWORK, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSPwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$UHRSWORK, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSPwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$UHRSWORK, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Fargo, ND +5* +1* +1
Cedar Rapids, IA +2* -6* -2
Rochester, MN +4* -3* -3
Dubuque, IA +1* -5* -4*
Grand Forks, ND +3* +2 -5*
Eau Claire, WI -7* -4* -6*
La Crosse, WI +6* -7* -7*
Mankato, MN -8* -8* -8*
Duluth, MN -9* -9* -9*
rm(a, b, City, t2017, t2018, t2019)

Proportion of Available-to-Work

leveneTest(AVAILABLE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##        Df F value Pr(>F)
## group   9  0.4795 0.8889
##       721
leveneTest(AVAILABLE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##        Df F value Pr(>F)
## group   9  0.3571 0.9548
##       788
leveneTest(AVAILABLE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##        Df F value Pr(>F)
## group   9  0.2675 0.9831
##       763
b <- as.data.frame(TukeyHSD(aov(AVAILABLE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017)))$CITYNAME)
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

b <- as.data.frame(TukeyHSD(aov(AVAILABLE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018)))$CITYNAME)
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

b <- as.data.frame(TukeyHSD(aov(AVAILABLE ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019)))$CITYNAME)
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Cedar Rapids, IA +2 -6 +1
La Crosse, WI -9 +4 -2
Dubuque, IA -8 +3 -3
Grand Forks, ND -7 +2 -4
Fargo, ND +3 +5 -5
Eau Claire, WI +4 +1 -6
Mankato, MN +1 -8 -7
Rochester, MN +5 -7 -8
Duluth, MN -6 -9 -9
rm(b, City, t2017, t2018, t2019)

Proportion of Available-and-Looking-to-Work

leveneTest(AVAILLOOK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##        Df F value Pr(>F)
## group   9  1.2256 0.2759
##       665
leveneTest(AVAILLOOK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##        Df F value Pr(>F)
## group   9  0.3895 0.9404
##       716
leveneTest(AVAILLOOK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##        Df F value Pr(>F)
## group   9  0.5986 0.7988
##       696
b <- as.data.frame(TukeyHSD(aov(AVAILLOOK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017)))$CITYNAME)
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

b <- as.data.frame(TukeyHSD(aov(AVAILLOOK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018)))$CITYNAME)
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

b <- as.data.frame(TukeyHSD(aov(AVAILLOOK ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019)))$CITYNAME)
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'lwr' < 0 & b$'upr' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Cedar Rapids, IA +1 -4 -1
Fargo, ND -4 -5 -2
La Crosse, WI -6 -9 -3
Dubuque, IA -7 -1 -4
Grand Forks, ND -8 -2 -5
Rochester, MN -2 -7 -6
Eau Claire, WI -5 -3 -7
Mankato, MN -9 -8 -8
Duluth, MN -3 -6 -9
rm(b, City, t2017, t2018, t2019)

Proportion of Education Attainment Level

## Finished up to high school
leveneTest(HS ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  11.522 < 2.2e-16 ***
##       12904                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(HS ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  13.493 < 2.2e-16 ***
##       12689                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(HS ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  16.797 < 2.2e-16 ***
##       12835                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSPwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$HS, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSPwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$HS, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSPwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$HS, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Dubuque, IA +1* +1* +1*
Eau Claire, WI +3* +2* +2*
La Crosse, WI +2* +3* -3*
Cedar Rapids, IA +4* +4 -4*
Mankato, MN +5* -6* -5*
Grand Forks, ND +6* -5 -6*
Fargo, ND +8 -8* -7*
Duluth, MN +7* -7* -8*
Rochester, MN -9* -9* -9*
rm(a, b, City, t2017, t2018, t2019)


## Some college
leveneTest(COL ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  6.7724 9.294e-10 ***
##       12904                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(COL ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  5.6386 8.092e-08 ***
##       12689                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(COL ~ CITYNAME, weights = PERWT, data = filter(IPUMSP, YEAR == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median: PERWT)
##          Df F value    Pr(>F)    
## group     9  6.4893 2.863e-09 ***
##       12835                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(IPUMSPwt, YEAR == 2017)
b <- as.data.frame(DTK.test(x = a$COL, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(IPUMSPwt, YEAR == 2018)
b <- as.data.frame(DTK.test(x = a$COL, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(IPUMSPwt, YEAR == 2019)
b <- as.data.frame(DTK.test(x = a$COL, f = a$CITYNAME, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 15, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

kable(left_join(t2019, t2018, by = "City") %>% 
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019))
City Rank2017 Rank2018 Rank2019
Duluth, MN +1* +3* +1*
Rochester, MN +3* +1* +2*
Fargo, ND +2* +2* +3*
Grand Forks, ND +5 +6* +4*
Mankato, MN +4* +4* +5*
La Crosse, WI -6* +5* +6*
Cedar Rapids, IA -8* -7 +7*
Eau Claire, WI -7* -8* +8*
Dubuque, IA -9* -9* -9*
rm(a, b, City, t2017, t2018, t2019)

Summarized Tables

## HHINCOME
IPUMS_HHINCOME <- IPUMSHH %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(HHINCOME_AVG = weighted.mean(HHINCOME, HHWT, na.rm = FALSE))

## PINCOME
IPUMS_PINCOME <- IPUMSP %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(PINCOME_AVG = weighted.mean(INCTOT, PERWT, na.rm = FALSE))

## FAMSIZE
IPUMS_FAMSIZE <- IPUMSHH %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(FAMSIZE_AVG = weighted.mean(FAMSIZE, HHWT, na.rm = FALSE))

## MORTAMT1
IPUMS_MORTAMT1 <- IPUMSHH %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(MORTAMT1_AVG = weighted.mean(MORTAMT1, HHWT, na.rm = FALSE))

## RENTGRS
IPUMS_RENTGRS <- IPUMSHH %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(RENTGRS_AVG = weighted.mean(RENTGRS, HHWT, na.rm = FALSE))

## TRANTIME
IPUMS_TRANTIME <- IPUMSP%>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(TRANTIME_AVG = weighted.mean(TRANTIME, PERWT, na.rm = FALSE))

## VALUEH
IPUMS_VALUEH <- IPUMSHH %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(VALUEH_AVG = weighted.mean(VALUEH, HHWT, na.rm = FALSE))

## AGE
IPUMS_AGE <- IPUMSP %>%
  group_by(YEAR, CITYNAME) %>% 
  summarize(AGE_AVG = weighted.mean(AGE, PERWT, na.rm = FALSE))

## UHRSWORK
IPUMS_UHRSWORK <- IPUMSP %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(UHRSWORK_AVG = weighted.mean(UHRSWORK, PERWT, na.rm = FALSE))

## AVAILABLE
IPUMS_AVAILABLE <- IPUMSP %>% 
  group_by(YEAR, CITYNAME, AVAILBLE) %>% 
  summarize(n = n(), WT = sum(PERWT)) %>% 
  mutate(wtN = n * WT) 

IPUMS_AVAILABLE2 <- IPUMS_AVAILABLE %>% 
  ungroup() %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(total = sum(wtN))

IPUMS_AVAILABLE <- left_join(IPUMS_AVAILABLE, IPUMS_AVAILABLE2, by = c("YEAR", "CITYNAME")) %>% 
  filter(AVAILBLE == 4) %>%
  mutate(Prop_AVAIL = wtN/total) %>% 
  ungroup() %>% 
  select(YEAR, CITYNAME, Prop_AVAIL)
rm(IPUMS_AVAILABLE2)

## AVAILLOOK
IPUMS_AVAILLOOK <- IPUMSP %>% 
  group_by(YEAR, CITYNAME, AVAILBLE, LOOKING) %>% 
  summarize(n = n(), WT = sum(PERWT)) %>% 
  mutate(wtN = n * WT) 

IPUMS_AVAILLOOK2 <- IPUMS_AVAILLOOK %>% 
  ungroup() %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(total = sum(wtN))

IPUMS_AVAILLOOK <- left_join(IPUMS_AVAILLOOK, IPUMS_AVAILLOOK2, by = c("YEAR", "CITYNAME")) %>% 
  filter(AVAILBLE == 4, LOOKING == 2) %>%
  mutate(Prop_AVAILnLOOK = wtN/total) %>% 
  ungroup() %>%   
  select(YEAR, CITYNAME, Prop_AVAILnLOOK)
rm(IPUMS_AVAILLOOK2)

## EDUC
IPUMS_EDUC <- IPUMSP %>% 
  group_by(YEAR, CITYNAME, EDUC2) %>% 
  summarize(n = n(), WT = sum(PERWT)) %>% 
  mutate(wtN = n * WT)

IPUMS_EDUC2 <- IPUMS_EDUC %>% 
  ungroup() %>% 
  group_by(YEAR, CITYNAME) %>% 
  summarize(total = sum(wtN))

IPUMS_EDUC <- left_join(IPUMS_EDUC, IPUMS_EDUC2, by = c("YEAR", "CITYNAME")) %>% 
  mutate(Prop = wtN/total) %>% 
  ungroup() %>%   
  select(YEAR, CITYNAME, EDUC2, Prop)
rm(IPUMS_EDUC2)

IPUMS_HS <- IPUMS_EDUC %>% 
  filter(EDUC2 == "HS")
IPUMS_COL <- IPUMS_EDUC %>% 
  filter(EDUC2 == "Some College")

LAUS

Labor Force

leveneTest(Civilian.Labor.Force ~ Area, data = filter(LAUS, Year == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  5.2284 6.504e-06 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Civilian.Labor.Force ~ Area, data = filter(LAUS, Year == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  4.8964 1.607e-05 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Civilian.Labor.Force ~ Area, data = filter(LAUS, Year == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  6.4682 2.399e-07 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Civilian.Labor.Force ~ Area, data = filter(LAUS, Year == 2020))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  5.5799 2.519e-06 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
a <- filter(LAUS, Year == 2017)
b <- as.data.frame(DTK.test(x = a$Civilian.Labor.Force, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(LAUS, Year == 2018)
b <- as.data.frame(DTK.test(x = a$Civilian.Labor.Force, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(LAUS, Year == 2019)
b <- as.data.frame(DTK.test(x = a$Civilian.Labor.Force, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

a <- filter(LAUS, Year == 2020)
b <- as.data.frame(DTK.test(x = a$Civilian.Labor.Force, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2020 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2020 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2020)

kable(left_join(t2020, t2019, by = "City") %>% 
  left_join(t2018, by = "City") %>%      
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019, Rank2020))
City Rank2017 Rank2018 Rank2019 Rank2020
Cedar Rapids, IA MSA +2* +1* +1* +1*
Duluth, MN-WI MSA +1* +2* +2* +2*
Fargo, ND-MN MSA +3* +3* +3* +3*
Rochester, MN MSA +4* +4* +4* +4*
Eau Claire, WI MSA -5* -5* -5* -5*
La Crosse-Onalaska, WI-MN MSA -6* -6* -6* -6*
Mankato-North Mankato, MN MSA -7* -7* -7* -7*
Dubuque, IA MSA -9* -8* -8* -8*
Grand Forks, ND-MN MSA -8* -9* -9* -9*
rm(a, b, City, t2017, t2018, t2019, t2020)

Employment

leveneTest(Employment ~ Area, data = filter(LAUS, Year == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  4.4094 6.138e-05 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Employment ~ Area, data = filter(LAUS, Year == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  5.4792 3.302e-06 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Employment ~ Area, data = filter(LAUS, Year == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9    6.36 3.183e-07 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Employment ~ Area, data = filter(LAUS, Year == 2020))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   9   1.404 0.1951
##       110
a <- filter(LAUS, Year == 2017)
b <- as.data.frame(DTK.test(x = a$Employment, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(LAUS, Year == 2018)
b <- as.data.frame(DTK.test(x = a$Employment, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(LAUS, Year == 2019)
b <- as.data.frame(DTK.test(x = a$Employment, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

a <- filter(LAUS, Year == 2020)
b <- as.data.frame(DTK.test(x = a$Employment, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2020 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2020 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2020)

kable(left_join(t2020, t2019, by = "City") %>% 
  left_join(t2018, by = "City") %>%      
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019, Rank2020))
City Rank2017 Rank2018 Rank2019 Rank2020
Fargo, ND-MN MSA +3* +3* +3* +1*
Cedar Rapids, IA MSA +2* +1* +1* +2*
Duluth, MN-WI MSA +1* +2* +2* +3*
Rochester, MN MSA +4* +4* +4* +4*
Eau Claire, WI MSA -5* -5* -5* -5*
La Crosse-Onalaska, WI-MN MSA -6* -6* -6* -6*
Mankato-North Mankato, MN MSA -7* -7* -7* -7*
Grand Forks, ND-MN MSA -8* -9* -9* -8*
Dubuque, IA MSA -9* -8* -8* -9*
rm(a, b, City, t2017, t2018, t2019, t2020)

Unemployment Rate

leveneTest(Unemployment.Rate ~ Area, data = filter(LAUS, Year == 2017))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   9  4.5951 3.676e-05 ***
##       110                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Unemployment.Rate ~ Area, data = filter(LAUS, Year == 2018))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value  Pr(>F)   
## group   9  3.3204 0.00127 **
##       110                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Unemployment.Rate ~ Area, data = filter(LAUS, Year == 2019))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value   Pr(>F)    
## group   9  3.7766 0.000356 ***
##       110                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(Unemployment.Rate ~ Area, data = filter(LAUS, Year == 2020))
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   9  0.7897 0.6263
##       110
a <- filter(LAUS, Year == 2017)
b <- as.data.frame(DTK.test(x = a$Unemployment.Rate, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2017 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2017 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2017)

a <- filter(LAUS, Year == 2018)
b <- as.data.frame(DTK.test(x = a$Unemployment.Rate, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2018 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2018 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2018)

a <- filter(LAUS, Year == 2019)
b <- as.data.frame(DTK.test(x = a$Unemployment.Rate, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2019 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2019 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2019)

a <- filter(LAUS, Year == 2020)
b <- as.data.frame(DTK.test(x = a$Unemployment.Rate, f = a$Area, a = 0.05)[[2]])
City <- rownames(b)
t2020 <- b %>% 
  mutate(Reject = ifelse((b$'Lower CI' < 0 & b$'Upper CI' > 0), FALSE, TRUE)) %>% 
  cbind(City) %>% 
  filter(str_detect(rownames(b), "St. Cloud, MN")) %>% 
  arrange(Diff) %>% 
  mutate(
    City = substr(City, 19, str_length(City)),
    Rank2020 = case_when(
      (Reject == TRUE  & Diff > 0)  ~ paste0("-", as.character(row_number()), "*"),
      (Reject == FALSE & Diff > 0)  ~ paste0("-", as.character(row_number())),
      (Reject == TRUE  & Diff <= 0) ~ paste0("+", as.character(row_number()), "*"),
      (Reject == FALSE & Diff <= 0) ~ paste0("+", as.character(row_number()))
    )
    ) %>% 
  select(City, Rank2020)

kable(left_join(t2020, t2019, by = "City") %>% 
  left_join(t2018, by = "City") %>%      
  left_join(t2017, by = "City") %>% 
  select(City, Rank2017, Rank2018, Rank2019, Rank2020))
City Rank2017 Rank2018 Rank2019 Rank2020
Duluth, MN-WI MSA +1* +1* +1* +1
Cedar Rapids, IA MSA -2 -2* -4* +2
Eau Claire, WI MSA -3* -3* +2 +3
Dubuque, IA MSA -4* -7* -8* +4
La Crosse-Onalaska, WI-MN MSA -5* -5* -3* -5
Rochester, MN MSA -6* -6* -5* -6
Mankato-North Mankato, MN MSA -8* -8* -7* -7
Grand Forks, ND-MN MSA -7* -4* -6* -8
Fargo, ND-MN MSA -9* -9* -9* -9
rm(a, b, City, t2017, t2018, t2019, t2020)

Summarized Tables

MeanFunction <- function(dataset, x, y, z) {
  dataset %>%
    group_by_(x, y) %>%
    summarize_(Mean = paste0("mean(", z, ", na.rm = TRUE)")) #note underscore after summarize
}
LAUS_LF <- MeanFunction(LAUS, "Year", "Area", 'Civilian.Labor.Force')
LAUS_EMP <- MeanFunction(LAUS, "Year", "Area", 'Employment')
LAUS_UM <- MeanFunction(LAUS, "Year", "Area", 'Unemployment.Rate')

write.csv(LAUS_LF, "LAUS_LF.csv")
write.csv(LAUS_EMP, "LAUS_EMP.csv")
write.csv(LAUS_UM, "LAUS_UM.csv")

OEWS

Prep

10 Cities of interest table

OEWS10 <- OEWS %>% 
  filter(
    AREA_NAME %in% c(
      "St. Cloud, MN", "Rochester, MN", "Duluth, MN-WI", "Mankato-North Mankato, MN", "Fargo, ND-MN", 
      "Grand Forks, ND-MN", "Eau Claire, WI", "La Crosse-Onalaska, WI-MN", "Dubuque, IA MSA", "Cedar Rapids, IA MSA")
  )

Major Occupations

OCCList <- unique(filter(OEWS10, OCC_GROUP == "major")$OCC_TITLE)
OEWSMajor <- filter(OEWS, OCC_TITLE %in% OCCList)
table(OEWSMajor$OCC_TITLE)
## 
##                   Architecture and Engineering Occupations 
##                                                       1739 
## Arts, Design, Entertainment, Sports, and Media Occupations 
##                                                       1744 
##  Building and Grounds Cleaning and Maintenance Occupations 
##                                                       1745 
##              Business and Financial Operations Occupations 
##                                                       1743 
##                   Community and Social Service Occupations 
##                                                       1742 
##                      Computer and Mathematical Occupations 
##                                                       1737 
##                    Construction and Extraction Occupations 
##                                                       1743 
##               Education, Training, and Library Occupations 
##                                                       1326 
##            Educational Instruction and Library Occupations 
##                                                        415 
##                 Farming, Fishing, and Forestry Occupations 
##                                                       1490 
##           Food Preparation and Serving Related Occupations 
##                                                       1745 
##         Healthcare Practitioners and Technical Occupations 
##                                                       1739 
##                             Healthcare Support Occupations 
##                                                       1745 
##          Installation, Maintenance, and Repair Occupations 
##                                                       1745 
##                                          Legal Occupations 
##                                                       1728 
##             Life, Physical, and Social Science Occupations 
##                                                       1739 
##                                     Management Occupations 
##                                                       1743 
##              Office and Administrative Support Occupations 
##                                                       1745 
##                      Personal Care and Service Occupations 
##                                                       1743 
##                                     Production Occupations 
##                                                       1742 
##                             Protective Service Occupations 
##                                                       1742 
##                              Sales and Related Occupations 
##                                                       1745 
##             Transportation and Material Moving Occupations 
##                                                       1744

Occupation Major Classification

for (i in c(1:7, 9:22)) {
  print(OCCList[i])
  a <- filter(OEWS10, YEAR == 2017 & OCC_TITLE == OCCList[i])
  pR2017 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2017 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2018 & OCC_TITLE == OCCList[i])
  pR2018 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2018 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2019 & OCC_TITLE == OCCList[i])
  pR2019 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2019 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2020 & OCC_TITLE == OCCList[i])
  pR2020 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2020 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  print(kable(cbind(pR2017, pR2018, pR2019, pR2020)))
  print(kable(cbind(pW2017, pW2018, pW2019, pW2020)))
  cat("\n\n\n")
  rm(pR2017, pR2018, pR2019, pR2020, pW2017, pW2018, pW2019, pW2020)
}

[1] “Management Occupations”

pR2017 pR2018 pR2019 pR2020
0.34375 1 0.6875 0.171875
pW2017 pW2018 pW2019 pW2020
0.28125 0.0625 0.28125 0.421875

[1] “Business and Financial Operations Occupations”

pR2017 pR2018 pR2019 pR2020
0.890625 0.890625 1 0.890625
pW2017 pW2018 pW2019 pW2020
0.6875 0.34375 0.890625 0.21875

[1] “Computer and Mathematical Occupations”

pR2017 pR2018 pR2019 pR2020
0.28125 0.796875 0.21875 0.421875
pW2017 pW2018 pW2019 pW2020
0.21875 0.421875 0.6875 1

[1] “Architecture and Engineering Occupations”

pR2017 pR2018 pR2019 pR2020
0.015625 0.015625 0.046875 0.125
pW2017 pW2018 pW2019 pW2020
0.015625 0.03125 0.015625 0.03125

[1] “Life, Physical, and Social Science Occupations”

pR2017 pR2018 pR2019 pR2020
0.03125 0.015625 0.03125 0.046875
pW2017 pW2018 pW2019 pW2020
0.28125 1 0.03125 1

[1] “Community and Social Service Occupations”

pR2017 pR2018 pR2019 pR2020
0.03125 0.09375 0.03125 0.015625
pW2017 pW2018 pW2019 pW2020
0.09375 0.046875 0.015625 0.015625

[1] “Legal Occupations”

pR2017 pR2018 pR2019 pR2020
0.046875 0.34375 0.046875 1
pW2017 pW2018 pW2019 pW2020
0.6875 0.5 0.6875 0.6875

[1] “Arts, Design, Entertainment, Sports, and Media Occupations”

pR2017 pR2018 pR2019 pR2020
0.03125 0.421875 1 0.015625
pW2017 pW2018 pW2019 pW2020
0.28125 0.890625 0.890625 0.28125

[1] “Healthcare Practitioners and Technical Occupations”

pR2017 pR2018 pR2019 pR2020
0.34375 1 0.171875 0.53125
pW2017 pW2018 pW2019 pW2020
0.21875 1 0.34375 0.34375

[1] “Healthcare Support Occupations”

pR2017 pR2018 pR2019 pR2020
0.171875 0.34375 0.28125 0.171875
pW2017 pW2018 pW2019 pW2020
0.59375 0.171875 0.421875 0.28125

[1] “Protective Service Occupations”

pR2017 pR2018 pR2019 pR2020
0.015625 0.015625 0.015625 0.09375
pW2017 pW2018 pW2019 pW2020
0.015625 0.015625 0.015625 0.171875

[1] “Food Preparation and Serving Related Occupations”

pR2017 pR2018 pR2019 pR2020
0.125 0.015625 0.015625 0.015625
pW2017 pW2018 pW2019 pW2020
0.015625 0.015625 0.03125 0.0625

[1] “Building and Grounds Cleaning and Maintenance Occupations”

pR2017 pR2018 pR2019 pR2020
0.046875 0.125 0.125 0.796875
pW2017 pW2018 pW2019 pW2020
0.03125 0.015625 0.015625 0.015625

[1] “Personal Care and Service Occupations”

pR2017 pR2018 pR2019 pR2020
0.03125 0.015625 0.125 0.0625
pW2017 pW2018 pW2019 pW2020
0.890625 0.125 0.34375 0.421875

[1] “Sales and Related Occupations”

pR2017 pR2018 pR2019 pR2020
0.015625 0.046875 0.5 0.421875
pW2017 pW2018 pW2019 pW2020
0.125 0.046875 0.21875 0.34375

[1] “Office and Administrative Support Occupations”

pR2017 pR2018 pR2019 pR2020
0.125 0.171875 0.0625 0.21875
pW2017 pW2018 pW2019 pW2020
0.5 0.03125 0.03125 0.28125

[1] “Farming, Fishing, and Forestry Occupations”

pR2017 pR2018 pR2019 pR2020
1 0.875 0.0625 0.75
pW2017 pW2018 pW2019 pW2020
0.59375 1 0.03125 0.03125

[1] “Construction and Extraction Occupations”

pR2017 pR2018 pR2019 pR2020
0.09375 0.046875 0.03125 0.171875
pW2017 pW2018 pW2019 pW2020
0.796875 0.796875 0.046875 0.171875

[1] “Installation, Maintenance, and Repair Occupations”

pR2017 pR2018 pR2019 pR2020
0.59375 0.015625 0.015625 0.171875
pW2017 pW2018 pW2019 pW2020
0.03125 0.015625 0.03125 0.046875

[1] “Production Occupations”

pR2017 pR2018 pR2019 pR2020
0.015625 0.015625 0.015625 0.015625
pW2017 pW2018 pW2019 pW2020
0.59375 1 0.59375 0.09375

[1] “Transportation and Material Moving Occupations”

pR2017 pR2018 pR2019 pR2020
0.015625 0.03125 0.015625 0.03125
pW2017 pW2018 pW2019 pW2020
0.21875 0.796875 0.34375 0.421875
print(paste(OCCList[8], "/", OCCList[23]))

[1] “Education, Training, and Library Occupations / Educational Instruction and Library Occupations”

  a <- filter(OEWS10, YEAR == 2017 & OCC_TITLE == OCCList[8])
  pR2017 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2017 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2018 & OCC_TITLE == OCCList[8])
  pR2018 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2018 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2019 & OCC_TITLE == OCCList[23])
  pR2019 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2019 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2020 & OCC_TITLE == OCCList[23])
  pR2020 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2020 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  kable(cbind(pR2017, pR2018, pR2019, pR2020))
pR2017 pR2018 pR2019 pR2020
0.125 0.0625 0.5 0.5
  kable(cbind(pW2017, pW2018, pW2019, pW2020))
pW2017 pW2018 pW2019 pW2020
0.125 0.1875 0.34375 0.59375
  rm(pR2017, pR2018, pR2019, pR2020, pW2017, pW2018, pW2019, pW2020)

Noticeable Occupation Sub-Classification

LOCQUOTIENT > 1 : More than US average 1 < : Less than US average

Low Quotient List: Lowest 25% of LOWQUO & St. Cloud Share at least 0.1% (Around TOT_EMP = 100)

OEWS_lowloc <- OEWS %>%
  filter(AREA_NAME == "St. Cloud, MN" & YEAR %in% c(2017, 2018, 2019, 2020) & OCC_GROUP != "major") %>%
  filter(LOCQUO <= quantile(OEWS$LOCQUO, na.rm = TRUE, 0.25) & JOBS_1000 >= 1) %>% 
  group_by(OCC_TITLE) %>% 
  summarize(n = n()) %>% 
  filter(n == 4)
## `summarise()` ungrouping output (override with `.groups` argument)
OEWS_lowloc <- OEWS_lowloc$OCC_TITLE
OEWS_lowloc

[1] “Accountants and Auditors”
[2] “Computer and Information Systems Managers”
[3] “Computer Systems Analysts”
[4] “First-Line Supervisors of Transportation and Material Moving Workers, Except Aircraft Cargo Handling Supervisors” [5] “Landscaping and Groundskeeping Workers”
[6] “Lawyers”
[7] “Management Analysts”
[8] “Market Research Analysts and Marketing Specialists”
[9] “Medical Assistants”
[10] “Paralegals and Legal Assistants”

for (i in 1:length(OEWS_lowloc)) {
  print(OEWS_lowloc[i])
  a <- filter(OEWS10, YEAR == 2017 & OCC_TITLE == OEWS_lowloc[i])
  pR2017 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2017 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2018 & OCC_TITLE == OEWS_lowloc[i])
  pR2018 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2018 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2019 & OCC_TITLE == OEWS_lowloc[i])
  pR2019 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2019 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2020 & OCC_TITLE == OEWS_lowloc[i])
  pR2020 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2020 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  print(kable(cbind(pR2017, pR2018, pR2019, pR2020)))
  print(kable(cbind(pW2017, pW2018, pW2019, pW2020)))
  cat("\n\n\n")
  rm(pR2017, pR2018, pR2019, pR2020, pW2017, pW2018, pW2019, pW2020)
}

[1] “Accountants and Auditors”

pR2017 pR2018 pR2019 pR2020
0.046875 0.171875 0.171875 0.171875
pW2017 pW2018 pW2019 pW2020
0.796875 0.5 1 0.046875

[1] “Computer and Information Systems Managers”

pR2017 pR2018 pR2019 pR2020
0.796875 0.125 0.796875 0.796875
pW2017 pW2018 pW2019 pW2020
1 0.75 1 1

[1] “Computer Systems Analysts”

pR2017 pR2018 pR2019 pR2020
0.59375 1 0.75 0.53125
pW2017 pW2018 pW2019 pW2020
0.21875 0.171875 0.75 0.875

[1] “First-Line Supervisors of Transportation and Material Moving Workers, Except Aircraft Cargo Handling Supervisors”

pR2017 pR2018 pR2019 pR2020
0.28125 0.421875 0.046875 0.03125
pW2017 pW2018 pW2019 pW2020
0.015625 0.015625 0.046875 0.171875

[1] “Landscaping and Groundskeeping Workers”

pR2017 pR2018 pR2019 pR2020
0.015625 0.015625 0.09375 0.015625
pW2017 pW2018 pW2019 pW2020
0.421875 0.28125 0.015625 0.015625

[1] “Lawyers”

pR2017 pR2018 pR2019 pR2020
0.015625 0.28125 0.046875 0.21875
pW2017 pW2018 pW2019 pW2020
0.28125 0.5 0.421875 0.6875

[1] “Management Analysts”

pR2017 pR2018 pR2019 pR2020
0.796875 0.421875 0.75 0.6875
pW2017 pW2018 pW2019 pW2020
1 0.09375 0.421875 0.796875

[1] “Market Research Analysts and Marketing Specialists”

pR2017 pR2018 pR2019 pR2020
1 0.171875 0.015625 0.015625
pW2017 pW2018 pW2019 pW2020
0.3125 0.890625 0.421875 0.21875

[1] “Medical Assistants”

pR2017 pR2018 pR2019 pR2020
0.34375 0.34375 0.1875 0.75
pW2017 pW2018 pW2019 pW2020
0.28125 0.28125 0.625 0.34375

[1] “Paralegals and Legal Assistants”

pR2017 pR2018 pR2019 pR2020
0.28125 0.6875 0.6875 0.28125
pW2017 pW2018 pW2019 pW2020
0.6875 0.09375 0.171875 0.03125

High Quotient List: Lowest 25% of LOWQUO & St. Cloud Share at least 0.1% (Around TOT_EMP = 100)

OEWS_highloc <- OEWS %>%
  filter(AREA_NAME == "St. Cloud, MN" & YEAR %in% c(2017, 2018, 2019, 2020) & OCC_GROUP != "major") %>%
  filter(LOCQUO >= quantile(OEWS$LOCQUO, na.rm = TRUE, 0.75) & JOBS_1000 >= 1) %>% 
  group_by(OCC_TITLE) %>% 
  summarize(n = n()) %>% 
  filter(n == 4)
## `summarise()` ungrouping output (override with `.groups` argument)
OEWS_highloc <- OEWS_highloc$OCC_TITLE
OEWS_highloc

[1] “Bartenders”
[2] “Bus and Truck Mechanics and Diesel Engine Specialists”
[3] “Cabinetmakers and Bench Carpenters”
[4] “Credit Analysts”
[5] “Food Batchmakers”
[6] “Heavy and Tractor-Trailer Truck Drivers”
[7] “Library Assistants, Clerical”
[8] “Licensed Practical and Licensed Vocational Nurses”
[9] “Mobile Heavy Equipment Mechanics, Except Engines”
[10] “Operating Engineers and Other Construction Equipment Operators”
[11] “Ophthalmic Laboratory Technicians”
[12] “Plumbers, Pipefitters, and Steamfitters”
[13] “Print Binding and Finishing Workers”
[14] “Printing Press Operators”
[15] “Separating, Filtering, Clarifying, Precipitating, and Still Machine Setters, Operators, and Tenders” [16] “Special Education Teachers, Secondary School”
[17] “Telecommunications Line Installers and Repairers”
[18] “Welders, Cutters, Solderers, and Brazers”
[19] “Woodworking Machine Setters, Operators, and Tenders, Except Sawing”

for (i in c(1:10, 12, 14:19)) {
  print(OEWS_highloc[i])
  a <- filter(OEWS10, YEAR == 2017 & OCC_TITLE == OEWS_highloc[i])
  pR2017 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2017 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2018 & OCC_TITLE == OEWS_highloc[i])
  pR2018 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2018 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2019 & OCC_TITLE == OEWS_highloc[i])
  pR2019 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2019 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  a <- filter(OEWS10, YEAR == 2020 & OCC_TITLE == OEWS_highloc[i])
  pR2020 <- pvalue(wilcoxsign_test(a$JOBS_1000 ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$JOBS_1000, nrow(a)), distribution = exact()))
  pW2020 <- pvalue(wilcoxsign_test(a$A_MEAN ~ rep(filter(a, AREA_NAME == "St. Cloud, MN")$A_MEAN, nrow(a)), distribution = exact()))
  print(kable(cbind(pR2017, pR2018, pR2019, pR2020)))
  print(kable(cbind(pW2017, pW2018, pW2019, pW2020)))
  cat("\n\n\n")
  rm(pR2017, pR2018, pR2019, pR2020, pW2017, pW2018, pW2019, pW2020)
}

[1] “Bartenders”

pR2017 pR2018 pR2019 pR2020
0.03125 0.015625 0.046875 0.125
pW2017 pW2018 pW2019 pW2020
0.015625 0.09375 0.171875 0.796875

[1] “Bus and Truck Mechanics and Diesel Engine Specialists”

pR2017 pR2018 pR2019 pR2020
0.28125 0.09375 0.03125 0.0625
pW2017 pW2018 pW2019 pW2020
0.015625 0.015625 0.125 0.6875

[1] “Cabinetmakers and Bench Carpenters”

pR2017 pR2018 pR2019 pR2020
0.0625 0.125 0.125 0.0625
pW2017 pW2018 pW2019 pW2020
0.875 0.125 0.125 0.375

[1] “Credit Analysts”

pR2017 pR2018 pR2019 pR2020
0.25 0.0625 0.0625 0.125
pW2017 pW2018 pW2019 pW2020
0.5 0.9375 0.75 0.125

[1] “Food Batchmakers”

pR2017 pR2018 pR2019 pR2020
0.25 0.75 1 0.75
pW2017 pW2018 pW2019 pW2020
0.9375 0.625 0.5 0.75

[1] “Heavy and Tractor-Trailer Truck Drivers”

pR2017 pR2018 pR2019 pR2020
0.015625 0.046875 0.015625 0.046875
pW2017 pW2018 pW2019 pW2020
0.0625 0.34375 0.21875 0.421875

[1] “Library Assistants, Clerical”

pR2017 pR2018 pR2019 pR2020
0.125 0.0625 0.0625 0.125
pW2017 pW2018 pW2019 pW2020
0.125 0.5 0.75 0.125

[1] “Licensed Practical and Licensed Vocational Nurses”

pR2017 pR2018 pR2019 pR2020
0.125 0.03125 0.0625 0.03125
pW2017 pW2018 pW2019 pW2020
0.875 0.796875 1 0.796875

[1] “Mobile Heavy Equipment Mechanics, Except Engines”

pR2017 pR2018 pR2019 pR2020
1 0.6875 0.0625 0.0625
pW2017 pW2018 pW2019 pW2020
0.28125 0.171875 1 0.015625

[1] “Operating Engineers and Other Construction Equipment Operators”

pR2017 pR2018 pR2019 pR2020
0.015625 0.03125 0.015625 0.09375
pW2017 pW2018 pW2019 pW2020
0.09375 0.21875 0.09375 0.171875

[1] “Plumbers, Pipefitters, and Steamfitters”

pR2017 pR2018 pR2019 pR2020
0.015625 0.015625 0.015625 0.015625
pW2017 pW2018 pW2019 pW2020
0.875 0.28125 0.34375 0.796875

[1] “Printing Press Operators”

pR2017 pR2018 pR2019 pR2020
0.796875 1 0.625 0.75
pW2017 pW2018 pW2019 pW2020
0.171875 0.03125 0.1875 0.03125

[1] “Separating, Filtering, Clarifying, Precipitating, and Still Machine Setters, Operators, and Tenders”

pR2017 pR2018 pR2019 pR2020
0.5 1 0.5 0.25
pW2017 pW2018 pW2019 pW2020
0.5 0.25 0.5 0.5

[1] “Special Education Teachers, Secondary School”

pR2017 pR2018 pR2019 pR2020
0.125 0.0625 0.0625 0.03125
pW2017 pW2018 pW2019 pW2020
0.75 0.75 0.53125 0.25

[1] “Telecommunications Line Installers and Repairers”

pR2017 pR2018 pR2019 pR2020
0.5 0.5 1 1
pW2017 pW2018 pW2019 pW2020
1 0.375 1 1

[1] “Welders, Cutters, Solderers, and Brazers”

pR2017 pR2018 pR2019 pR2020
0.015625 0.015625 0.015625 0.015625
pW2017 pW2018 pW2019 pW2020
0.34375 0.046875 0.125 0.59375

[1] “Woodworking Machine Setters, Operators, and Tenders, Except Sawing”

pR2017 pR2018 pR2019 pR2020
0.875 0.625 1 0.25
pW2017 pW2018 pW2019 pW2020
0.0625 0.125 0.25 1
## Pairwise Zero - No result (average)
OEWS_highloc[1]

[1] “Bartenders”

OEWS_highloc[13]

[1] “Print Binding and Finishing Workers”