# load data: Manifestos (2020) and Euromanifesto files + Parlgov
MORPOR_full <- read_dta("~/Desktop/datasets/MPDataset_MPDS2020a_stata14.dta")
Parlgov_cabinet <- read_excel("~/Desktop/datasets/Parlgov_cabinet.xlsx")
#MORPOR: select only the countries we care about (EU members)
EUmembers <- c("Austria", "Belgium", "Bulgaria", "Croatia", "Czech Republic", "Cyprus", "Denmark", "Estonia", "Finland", "France", "Germany", "Greece", "Hungary", "Ireland", "Italy", "Latvia", "Lithuania", "Luxembourg", "Malta", "Netherlands", "Poland", "Portugal", "Romania", "Slovakia", "Slovenia", "Spain", "Sweden", "United Kingdom")
MORPOR <- MORPOR_full %>% filter(countryname %in% EUmembers)
#MORPOR: select the years we care about: starting with 2004 just in case
MORPOR$edate <- ymd(MORPOR$edate)
MORPOR <- MORPOR %>% filter(edate >= "2004-01-01")
unique(MORPOR$countryname) #data for Maltease elections only for 1996 & 1998
## [1] "Sweden" "Denmark" "Finland" "Belgium"
## [5] "Netherlands" "Luxembourg" "France" "Italy"
## [9] "Spain" "Greece" "Portugal" "Germany"
## [13] "Austria" "United Kingdom" "Ireland" "Cyprus"
## [17] "Bulgaria" "Croatia" "Czech Republic" "Estonia"
## [21] "Hungary" "Latvia" "Lithuania" "Poland"
## [25] "Romania" "Slovakia" "Slovenia"
#PARLGOV: select only the countries we care about (EU members)
parlgov <- Parlgov_cabinet %>% filter(country_name %in% EUmembers)
#PARLGOV: select the years we care about: starting with 2004 just in case
parlgov$election_date <- ymd(parlgov$election_date)
parlgov <- parlgov %>% filter(election_date >= "2004-01-01")
# now we need to merge the parlgov & manifesto data
# this we can do using the election dates, but the problem always appears with party names
# to deal with it, I will use simple livenstein distance and then manually check whether everyhting makes sense
# function to clean the partyname strings
stringCleaning <- function(x) {
# x <- stringr::str_trim(x) ## trim the string
# x <- tolower(x) ## everything to lower case
# x <- gsub("\\s+", " ", x) ##only one wite space
# x <- gsub("[^[:space:]A-z0-9]", "", x) ## delete all unconventional symbols
stringr::str_trim(tolower(gsub("\\s+", " ", gsub("[^[:space:]A-z0-9]", "", x))))
}
parties_morpor <- MORPOR %>% select(countryname, partyname) %>% distinct()
# select only governing parties in parlgov data
parlgov_gov <- parlgov %>% filter(cabinet_party == 1)
parties_parlgov <- parlgov_gov %>% select(country_name, election_date, party_name_english) %>% distinct()
# clean the partyname strings
parties_morpor$clean <- stringCleaning(parties_morpor$partyname)
parties_parlgov$clean <- stringCleaning(parties_parlgov$party_name_english)
# now proceed with the comparison
library(stringdist)
parties_parlgov$check <- parties_morpor$partyname[sapply(parties_parlgov$clean, function(x) {
which.min(stringdist::stringdist(x, parties_morpor$clean))
})]
# manual check in excel
write_xlsx(parties_parlgov, path = "~/Desktop/datasets/parties_parlgov_new.xlsx")
# many parties are matched correctly, quite some -- not. All are checked and corrected manually, in case of inconsistency of coalition-single party formats (as if, manifesto data contains single party names and parlgov only broad coalition (and vise versa)), all coalition parties are presented as unique observations for each party -- at least when parties were recorded in both dataset.
### PROBLEMATIC CASES
# Lidem (Czech Republic) -- split from Public Affairs in 2012, in government for one year since 27.04.2012 -- no info in MORPOR data
# Italian Reformists (Italy) -- participated in elections (2006 and 2013) in different lists, the 2013 list (Amnesty, Justice and Freedom) received 0.2% -- no representatives, no manifesto, though it hold ministry of foreign affairs
# Go Italy -- The People of Freedom -- in morpor seprate records
# New Centre-Right | Popular Alternative (Italy) -- split from PdL, no morpor record
# Italy Alive -- no manigesto data 2018
# Left Ecology Freedom -- no manifesto 2018
# New Centre-Right | Popular Alternative -- no records in manifesto data (2013)
# Social Democratic Labour Party of Lithuania -- split from Social Democratic Party of Lithuania in 2018, new party continued work in government, no manifesto data
# Civic Union (Latvia) -- founded in 2008 (during parliamentary term) by members of two parliamentary parties, was in government, no info in manifesto. In 2011 merged to Unity (in manifesto data is called like this in 2010 elections)
# no manifesto data for Malta
#Democratic party (Luxembourg) -- no manifesto data for 2018
#Socialist Workers’ Party of Luxembourg -- no manifesto data for 2018
#The Greens (Luxembourg) -- no manifesto data for 2018
#Democratic and Social Centre -- People's Party (Portugal) -- no manifesto data 2015
#Social Democratic Party (Portugal) -- no manifesto data 2015
# conservative party (romania) -- in parlgov as a single party, in morpor (and reality): 2008 -- coalition Social Democratic Party + Conservative Party Alliance; 2012 -- social liberal union, 2015 -- ALDE
# Liberal Reformist Party (romania) -- part of social liberal union until 2014, in parlgov is named with a name since 2014 for 2012 elections
# National Union for the Progress of Romania -- founded in 2010, was in government (but no data for 2008 elections). in 2012 elections -- part of social liberal union
#National Liberal Party -- Social Liberal Union 2012
# Party of Liberty and Progress | Flemish Liberals and Democrats (Belgium) in manifesto data only Flemish Liberals and Democrats
# Christian-Democrat and Flemish / New Flemish Alliance -- in morpor only NVA, no CD
#Humanist Democratic Centre -- no manifest0 2014
#reformist movement -- no manifesto 2014
#Francophone Socialist Party -- no manifesto 2014
# Coalition for Bulgaria | Democratic Left -- in parlgov, in morpor BSP-left Bulgaria, coalition for Bulgaria, but manifesto only available for Coalition for Bulgaria 2005 and 2009, BSP-left Bulgaria 2014, missing for 2013
#Bulgarian Socialsit party -- BSP-left Bulgaria 2014
#National Front for the Salvation of Bulgaria -- United Patriots 2017
#National Movement Simeon II -- no manifesto 2014
#Union of Democratic Forces -- Reformist bloc 2014
# New Alternative | Blue Reform (Finland) -- no in morpor, split from true finns in 2017
#Croatian Democratic Union -- Patriotic Coalition 2015
#Croatian People's Party -- Liberal Democrats -- Kukuriku Coalition 2011, People's coalition in 2016
#Istrian Democratic Assembly -- Kukuriku Coalition 2011
#Social Democratic Party of Croatia -- Kukuriku Coalition 2011
#European party (cyprus) -- Solidarity Movement 2016
#no Estonian manifestos 03.2019
# Social Democratic Party | Moderates (Estonia) -- in morpor social democratic party
#Les verts (france) -- Europe Ecology - The Greens 2012
#New centre (france) -- no manifesto 2007
#Radical Party of the Left -- no manifesto 2007
# Union for a Popular Movement | The Republicans -- in morpor separate records (for 2007 and 2012 UMP, for 2017 the republicans)
#Union for French Democracy | Democratic Movement -- in morpor only democratic movement
# Alliance of Federation of Young Democrats - Hungarian Civic Union - Christian Democratic People's Party -- no manifesto 2018
parties_parlgov <- read_excel("~/Desktop/Datasets/parties_parlgov_match.xlsx")
# merge with hand-checked parties
colnames(parties_parlgov) <- c("country_name","election_date","party_name_english", "check", "partyname")
parties_parlgov$country_name <- str_trim(parties_parlgov$country_name)
parties_parlgov$party_name_english <- str_trim(parties_parlgov$party_name_english)
parlgov_gov$country_name <- str_trim(parlgov_gov$country_name)
parlgov_gov$party_name_english <- str_trim(parlgov_gov$party_name_english)
Encoding(parties_parlgov$party_name_english)
## [1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [8] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [15] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [22] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [29] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [36] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [43] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [50] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [57] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [64] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [71] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [78] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [85] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [92] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [99] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [106] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [113] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [120] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [127] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [134] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [141] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [148] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [155] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [162] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [169] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [176] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [183] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [190] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [197] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [204] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [211] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [218] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [225] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [232] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [239] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [246] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [253] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [260] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [267] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [274] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [281] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [288] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [295] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [302] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [309] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [316] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [323] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [330] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [337] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [344] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [351] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [358] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [365] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [372] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [379] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [386] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [393] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
Encoding(parlgov_gov$party_name_english)
## [1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [8] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [15] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [22] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [29] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [36] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [43] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [50] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [57] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [64] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [71] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [78] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [85] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [92] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [99] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [106] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [113] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [120] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [127] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [134] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [141] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [148] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [155] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [162] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [169] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [176] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [183] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [190] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [197] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [204] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [211] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [218] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [225] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [232] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [239] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [246] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [253] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [260] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [267] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [274] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [281] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [288] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [295] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [302] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [309] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [316] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [323] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [330] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [337] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [344] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [351] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [358] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [365] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [372] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [379] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [386] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [393] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [400] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [407] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [414] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [421] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [428] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [435] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [442] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [449] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [456] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [463] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [470] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [477] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [484] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [491] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [498] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [505] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [512] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [519] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [526] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [533] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [540] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [547] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [554] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [561] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [568] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [575] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [582] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [589] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [596] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [603] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [610] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [617] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [624] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
## [631] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
#strings have weird encoding (thanks excel, so will merge by cleaned strings)
parties_parlgov$clean <- stringCleaning(parties_parlgov$party_name_english)
parlgov_gov$clean <- stringCleaning(parlgov_gov$party_name_english)
parlgov_gov <- left_join(parlgov_gov, parties_parlgov, by = c("clean", "election_date", "country_name"))
which(is.na(parlgov_gov$partyname)) # 39 missing observations, mostly 'no party affiliation', or problematic cases
## [1] 1 2 11 12 13 14 62 63 64 65 66 67 68 69 70 71 72
## [18] 73 74 75 76 77 78 79 80 82 84 85 86 114 119 123 126 143
## [35] 144 158 159 167 168 169 170 171 223 275 281 282 293 310 315 316 317
## [52] 322 341 342 343 344 345 346 347 348 349 350 351 352 355 358 361 363
## [69] 366 368 371 376 377 379 382 383 384 385 386 387 388 389 390 391 392
## [86] 414 417 420 421 422 496 497 498 499 500 501 502 511 519 520 521 522
## [103] 523 524 525 526 527 528 535 538 553 563 564 565 588 589 590 591 592
## [120] 593 594 595
save(parlgov_gov, file = "parlgov_gov.RData")
# select all necessary variables from morpor data
MORPOR <- MORPOR %>% select(country, countryname, oecdmember, eumember, edate, date, party, partyname, partyabbrev, parfam, pervote, voteest, presvote, absseat, totseats, progtype, total, per703_1, per703_2, per403, per402, per414, per413, per704, per401, per201, per202_1, per503, per705, per607_3, per202_2, per608_3, per502, per607_1, per608_1, per104, per105, per506, per507, per411, per416_2, per501, per410 ,per701, per405, per702, per108, per110, per302, per101, per103, per106, per107, per102, per109, per406, per407, per504, per505, per7062, per602_2, per607_2, per601_2, per608_2, per304, per605_1, per605_2, per404, per410, per412, per414, per409, per416, per401, per402, per501, per413, per301, per402, per411, per503, per504, per706, per505, per411, per703_1, per703_2)
# create additive variables & rename
#BFIM
MORPOR <- MORPOR %>% mutate(BFIM_pos = per403 + per402 + per414 + per413 + per704)
MORPOR <- MORPOR %>% mutate(BFIM_neg = per401)
#Civil rights
MORPOR <- MORPOR %>% mutate(Rigts_pos = per201 + per202_1 + per503 + per705 + per607_3)
MORPOR <- MORPOR %>% mutate(Rigts_neg = per202_2 + per608_3)
#Culture and media
MORPOR <- MORPOR %>% mutate(Culture_pos = per502 + per607_1)
MORPOR <- MORPOR %>% mutate(Culture_neg = per608_1)
#Environment
MORPOR <- MORPOR %>% mutate(Environment_pos = per416 + per501)
MORPOR <- MORPOR %>% mutate(Environment_neg = per410)
#Employment
MORPOR <- MORPOR %>% mutate(Employment_pos = per701 + per405)
MORPOR <- MORPOR %>% mutate(Employment_neg = per701 + per702)
#EU governance
MORPOR <- MORPOR %>% mutate(EU_pos = per108 + per302)
MORPOR <- MORPOR %>% mutate(EU_neg = per110)
#Foreign Affairs
MORPOR <- MORPOR %>% mutate(Foreign_pos = per101 + per103 + per106 + per107)
MORPOR <- MORPOR %>% mutate(Foreign_neg = per102 + per109)
#Immigration
MORPOR <- MORPOR %>% mutate(Immigration_pos = per7062 + per602_2 + per607_2)
MORPOR <- MORPOR %>% mutate(Immigration_neg = per601_2 + per608_2)
#Law and Crime
MORPOR <- MORPOR %>% mutate(LawCrime_pos = per304 + per605_1)
MORPOR <- MORPOR %>% mutate(LawCrime_neg = per605_2)
#Macroeconomics
MORPOR <- MORPOR %>% mutate(Macroeconomics_pos = per404 + per410 + per412 + per414 + per409)
MORPOR <- MORPOR %>% mutate(Macroeconomics_neg = per416 + per401 + per402)
#PLWMTI (no negative)
MORPOR <- MORPOR %>% mutate(PLWMTI_pos = per501 + per413)
#Regional policy (no negative)
MORPOR <- MORPOR %>% mutate(Regional_pos = per301 + per402)
#Social policy
MORPOR <- MORPOR %>% mutate(Social_pos = per503 + per504 + per706)
MORPOR <- MORPOR %>% mutate(Social_neg = per505)
#Agriculture
MORPOR <- MORPOR %>% mutate(Agriculture_pos = per703_1)
MORPOR <- MORPOR %>% mutate(Agriculture_neg = per703_2)
#Defense
MORPOR <- MORPOR %>% mutate(Defense_pos = per104)
MORPOR <- MORPOR %>% mutate(Defense_neg = per105)
#Education
MORPOR <- MORPOR %>% mutate(Education_pos = per506)
MORPOR <- MORPOR %>% mutate(Education_neg = per507)
#Energy (no negative)
MORPOR <- MORPOR %>% mutate(Energy_pos = per411)
#Foreign Trade
MORPOR <- MORPOR %>% mutate(ForTrade_pos = per406)
MORPOR <- MORPOR %>% mutate(ForTrade_neg = per407)
#Health
MORPOR <- MORPOR %>% mutate(Health_pos = per504)
MORPOR <- MORPOR %>% mutate(Health_neg = per505)
#Science (no negative)
MORPOR <- MORPOR %>% mutate(STI_pos = per411)
#Transportation (no negative)
MORPOR <- MORPOR %>% mutate(Transportation_pos = per411)
#Fish
MORPOR <- MORPOR %>% mutate(Fisheries_pos = per703_1)
MORPOR <- MORPOR %>% mutate(Fisheries_neg = per703_2)
#Select only constructed variables
MORPOR <- MORPOR %>% select(country, countryname, oecdmember, eumember, edate, date, party, partyname, partyabbrev, parfam, pervote, voteest, presvote, absseat, totseats, progtype, total, BFIM_pos, BFIM_neg, Rigts_pos, Rigts_neg, Culture_pos, Culture_neg, Environment_pos, Environment_neg, Employment_pos, Employment_neg, EU_pos, EU_neg, Foreign_pos, Foreign_neg, Immigration_pos, Immigration_neg, LawCrime_pos, LawCrime_neg, Macroeconomics_pos, Macroeconomics_neg, PLWMTI_pos, Regional_pos, Social_pos, Social_neg, Agriculture_pos, Agriculture_neg, Defense_pos, Defense_neg, Education_pos, Education_neg, Energy_pos, ForTrade_pos, ForTrade_neg, Health_pos, Health_neg, STI_pos, Transportation_pos, Fisheries_pos, Fisheries_neg)
# Construct a measure using Lowe et al (2011)
# the general estimation is as follows: log((R+offset)/(L+offset)), where R -- right issue categories (in our case -- negative), L -- left issue categories (in our case -- positive), offset is necessary for smoothing and stabilizing the position estimates
MORPOR$offset <- 0.5 / MORPOR$total * 100 # for the percentages instead of counts as in the original Lowe scale (in the supplementary material)
#following Lowe, overwrite cases where total number of statements is missing with 200
MORPOR$offset[is.na(MORPOR$total)] <- 0.5 / 200 * 100
### use CAP-EUPAP policy areas codes for variable names
# BFIM 15
MORPOR$CAP15 <- log((MORPOR$BFIM_neg + MORPOR$offset)/(MORPOR$BFIM_pos + MORPOR$offset))
# Rights 2
MORPOR$CAP2 <- log((MORPOR$Rigts_neg+MORPOR$offset)/(MORPOR$Rigts_pos+MORPOR$offset))
# Culture 23
MORPOR$CAP23 <- log((MORPOR$Culture_neg+MORPOR$offset)/(MORPOR$Culture_pos+MORPOR$offset))
#Environment 7
MORPOR$CAP7 <- log((MORPOR$Environment_neg+MORPOR$offset)/(MORPOR$Environment_pos+MORPOR$offset))
#Employment 5
MORPOR$CAP5 <- log((MORPOR$Employment_neg+MORPOR$offset)/(MORPOR$Employment_pos+MORPOR$offset))
#EU 20
MORPOR$CAP20 <- log((MORPOR$EU_neg+MORPOR$offset)/(MORPOR$EU_pos+MORPOR$offset))
#Foreign Affairs 19
MORPOR$CAP19 <- log((MORPOR$Foreign_neg+MORPOR$offset)/(MORPOR$Foreign_pos+MORPOR$offset))
#Immigration 9
MORPOR$CAP9 <- log((MORPOR$Immigration_neg+MORPOR$offset)/(MORPOR$Immigration_pos+MORPOR$offset))
#Law/Crime 12
MORPOR$CAP12 <- log((MORPOR$LawCrime_neg+MORPOR$offset)/(MORPOR$LawCrime_pos+MORPOR$offset))
#Macroeconomics 1
MORPOR$CAP1 <- log((MORPOR$Macroeconomics_neg+MORPOR$offset)/(MORPOR$Macroeconomics_pos+MORPOR$offset))
#PLWMTI (no negative category) 21
MORPOR$CAP21 <- log((0+MORPOR$offset)/(MORPOR$PLWMTI_pos+MORPOR$offset))
#Regional policy (no negative position) 14
MORPOR$CAP14 <- log((0+MORPOR$offset)/(MORPOR$Regional_pos+MORPOR$offset))
#Social policy 13
MORPOR$CAP13 <- log((MORPOR$Social_neg+MORPOR$offset)/(MORPOR$Social_pos+MORPOR$offset))
#Agriculture 4
MORPOR$CAP4 <- log((MORPOR$Agriculture_neg+MORPOR$offset)/(MORPOR$Agriculture_pos+MORPOR$offset))
#Defence 16
MORPOR$CAP16 <- log((MORPOR$Defense_neg+MORPOR$offset)/(MORPOR$Defense_pos+MORPOR$offset))
#Education 6
MORPOR$CAP6 <- log((MORPOR$Education_neg+MORPOR$offset)/(MORPOR$Education_pos+MORPOR$offset))
#Energy (no negative category) 8
MORPOR$CAP8 <- log((0+MORPOR$offset)/(MORPOR$Energy_pos+MORPOR$offset))
#Foreign Trade 18
MORPOR$CAP18 <- log((MORPOR$ForTrade_neg+MORPOR$offset)/(MORPOR$ForTrade_pos+MORPOR$offset))
#Health 3
MORPOR$CAP3 <- log((MORPOR$Health_neg+MORPOR$offset)/(MORPOR$Health_pos+MORPOR$offset))
#STI (no negative category) 17
MORPOR$CAP17 <- log((0+MORPOR$offset)/(MORPOR$STI_pos+MORPOR$offset))
#Transportation (no negative category) 10
MORPOR$CAP10 <- log((0+MORPOR$offset)/(MORPOR$Transportation_pos+MORPOR$offset))
#Fisheries 24
MORPOR$CAP24 <- log((MORPOR$Fisheries_neg+MORPOR$offset)/(MORPOR$Fisheries_pos+MORPOR$offset))
#subset data to have position variables
MORPOR_positions <- MORPOR %>% select(country, countryname, oecdmember, eumember, edate, date, party, partyname, partyabbrev, parfam, pervote, voteest, presvote, absseat, totseats, progtype, total, CAP1, CAP2, CAP3, CAP4, CAP5, CAP6, CAP7, CAP8, CAP9, CAP10, CAP12, CAP13, CAP14, CAP15, CAP16, CAP17, CAP18, CAP19, CAP20, CAP21, CAP23, CAP24)
# assign nice labels to the positions variables
library(sjlabelled)
##
## Attaching package: 'sjlabelled'
## The following object is masked from 'package:forcats':
##
## as_factor
## The following object is masked from 'package:dplyr':
##
## as_label
## The following objects are masked from 'package:haven':
##
## as_factor, read_sas, read_spss, read_stata, write_sas,
## zap_labels
set_label(MORPOR_positions$CAP1) <- "Macroeconomics"
set_label(MORPOR_positions$CAP2) <- "Civil Rights, Minority Issues and Civil Liberties"
set_label(MORPOR_positions$CAP3) <- "Health"
set_label(MORPOR_positions$CAP4) <- "Agriculture"
set_label(MORPOR_positions$CAP5) <- "Labour and Employment"
set_label(MORPOR_positions$CAP6) <- "Education"
set_label(MORPOR_positions$CAP7) <- "Environment"
set_label(MORPOR_positions$CAP8) <- "Energy"
set_label(MORPOR_positions$CAP9) <- "Immigration"
set_label(MORPOR_positions$CAP10) <- "Transportation"
set_label(MORPOR_positions$CAP12) <- "Law and Crime"
set_label(MORPOR_positions$CAP13) <- "Social Policy"
set_label(MORPOR_positions$CAP14) <- "Regional and Urban Policy and Planning"
set_label(MORPOR_positions$CAP15) <- "Banking, Finance and Internal Trade"
set_label(MORPOR_positions$CAP16) <- "Defence"
set_label(MORPOR_positions$CAP17) <- "Space, Science, Technology and Communications"
set_label(MORPOR_positions$CAP18) <- "Foreign Trade"
set_label(MORPOR_positions$CAP19) <- "International Affairs and Foreign Aid"
set_label(MORPOR_positions$CAP20) <- "EU Governance and Government Operations"
set_label(MORPOR_positions$CAP21) <- "Public Lands, Water Management and Territorial Issues"
set_label(MORPOR_positions$CAP23) <- "Culture and Media"
set_label(MORPOR_positions$CAP24) <- "Fisheries"
save(MORPOR_positions, file = "MORPOR_positions.RData")
#merging MORPOR and parlgov data
#datasets MORPOR_positions and parlgov_gov
#merging by country, election date, and clean partyname (again, issues with encoding)
MORPOR_positions$clean_name <- stringCleaning(MORPOR_positions$partyname)
parlgov_gov$clean_name <- stringCleaning(parlgov_gov$partyname)
gov_positions <- left_join(parlgov_gov, MORPOR_positions, by = c("country_name" = "countryname", "election_date" = "edate", "clean_name" = "clean_name"))
save(gov_positions, file = "gov_positions.RData")
write_xlsx(gov_positions, path = "~/Desktop/datasets/gov_positions.xlsx")
#in general, merge worked pretty well, apart from France, 3 obs from Czech Republic, 4 from Hungary, 2 from Poland, 10 from Slovakia
#france because election date are different: morpor 2007-06-10, 2012-06-10, 2017-06-11, parlgov 2007-06-17, 2012-06-17, 2017-06-18
parlgov_gov$election_date[parlgov_gov$election_date == "2007-06-17" & parlgov_gov$country_name == "France"] <- "2007-06-10"
parlgov_gov$election_date[parlgov_gov$election_date == "2012-06-17" & parlgov_gov$country_name == "France"] <- "2012-06-10"
parlgov_gov$election_date[parlgov_gov$election_date == "2017-06-18" & parlgov_gov$country_name == "France"] <- "2017-06-11"
parlgov_gov$election_date <- ymd(parlgov_gov$election_date)
#same with Czech Republic (elections in 2013): morpor 2013-10-26, parlgov 2013-10-25
parlgov_gov$election_date[parlgov_gov$election_date == "2013-10-25" & parlgov_gov$country_name == "Czech Republic"] <- "2013-10-26"
#Slovakia (elections in 2016): morpor 2016-03-05, parlgov 2016-03-06
parlgov_gov$election_date[parlgov_gov$election_date == "2016-03-06" & parlgov_gov$country_name == "Slovakia"] <- "2016-03-05"
#Poland (elections 2007): morpor 2007-10-21, parlgov 2007-10-19
parlgov_gov$election_date[parlgov_gov$election_date == "2007-10-19" & parlgov_gov$country_name == "Poland"] <- "2007-10-21"
#Hungary (elections 2010): morpor 2010-04-11, parlgov 2010-04-25
parlgov_gov$election_date[parlgov_gov$election_date == "2010-04-25" & parlgov_gov$country_name == "Hungary"] <- "2010-04-11"
parlgov_gov$election_date <- ymd(parlgov_gov$election_date)
gov_positions_final <- left_join(parlgov_gov, MORPOR_positions, by = c("country_name" = "countryname", "election_date" = "edate", "clean_name" = "clean_name"))
#delete duplicated variables
gov_positions_final$party_name_english.y <- NULL
gov_positions_final$clean <- NULL
gov_positions_final$check <- NULL
gov_positions_final$partyname.y <- NULL
gov_positions_final$clean_name <- NULL
#rename remaining duplicated variables
gov_positions_final <- rename(gov_positions_final, party_name_english = party_name_english.x)
gov_positions_final <- rename(gov_positions_final, partyname = partyname.x)
#positions of governments
# 2 methods: mean position of the cabinet and weight by the share of seats relative to all government seats
#calculate seats of each cabinet
gov_positions_final <- gov_positions_final %>% group_by(cabinet_id) %>% mutate(gov_seats = sum(seats)) %>% ungroup()
#seat share of each party in the cabinet
gov_positions_final <- gov_positions_final %>% mutate(seat_gov_share = seats/gov_seats)
#calculate simple mean of position of the cabinet FOR EACH POLICY AREA (for parties that have a position)
gov_positions_final <- gov_positions_final %>% group_by(cabinet_id) %>% mutate(mean_1 = round(mean(CAP1, na.rm = TRUE),3), mean_2 = round(mean(CAP2, na.rm=T),3), mean_3 = round(mean(CAP3, na.rm=T),3), mean_4 = round(mean(CAP4, na.rm=T),3), mean_5 = round(mean(CAP5, na.rm=T),3), mean_6 = round(mean(CAP6, na.rm=T),3), mean_7 = round(mean(CAP7, na.rm=T),3), mean_8 = round(mean(CAP8, na.rm=T),3), mean_9 = round(mean(CAP9, na.rm=T),3), mean_10 = round(mean(CAP10, na.rm=T),3), mean_12 = round(mean(CAP12, na.rm=T),3), mean_13 = round(mean(CAP13, na.rm=T),3), mean_14 = round(mean(CAP14, na.rm=T),3), mean_15 = round(mean(CAP15, na.rm=T),3), mean_16 = round(mean(CAP16, na.rm=T),3), mean_17 = round(mean(CAP17, na.rm=T),3), mean_18 = round(mean(CAP18, na.rm=T),3), mean_19 = round(mean(CAP19, na.rm=T),3), mean_20 = round(mean(CAP20, na.rm=T),3), mean_21 = round(mean(CAP21, na.rm=T),3), mean_23 = round(mean(CAP23, na.rm=T),3), mean_24 = round(mean(CAP24, na.rm=T),3)) %>% ungroup()
#calculate weighted mean
gov_positions_final <- gov_positions_final %>% group_by(cabinet_id) %>% mutate(weighted.mean_1 = round(weighted.mean(CAP1, seat_gov_share, na.rm=TRUE),3), weighted.mean_2 = round(weighted.mean(CAP2, seat_gov_share, na.rm=T),3), weighted.mean_3 = round(weighted.mean(CAP3, seat_gov_share, na.rm=T),3), weighted.mean_4 = round(weighted.mean(CAP4, seat_gov_share, na.rm=T),3), weighted.mean_5 = round(weighted.mean(CAP5, seat_gov_share, na.rm=T),3), weighted.mean_6 = round(weighted.mean(CAP6, seat_gov_share, na.rm=T),3), weighted.mean_7 = round(weighted.mean(CAP7, seat_gov_share, na.rm=T),3), weighted.mean_8 = round(weighted.mean(CAP8, seat_gov_share, na.rm=T),3), weighted.mean_9 = round(weighted.mean(CAP9, seat_gov_share, na.rm=T),3), weighted.mean_10 = round(weighted.mean(CAP10, seat_gov_share, na.rm=T),3), weighted.mean_12 = round(weighted.mean(CAP12, seat_gov_share, na.rm=T),3), weighted.mean_13 = round(weighted.mean(CAP13, seat_gov_share, na.rm=T),3), weighted.mean_14 = round(weighted.mean(CAP14, seat_gov_share, na.rm=T),3), weighted.mean_15 = round(weighted.mean(CAP15, seat_gov_share, na.rm=T),3), weighted.mean_16 = round(weighted.mean(CAP16, seat_gov_share, na.rm=T),3), weighted.mean_17 = round(weighted.mean(CAP17, seat_gov_share, na.rm=T),3), weighted.mean_18 = round(weighted.mean(CAP18, seat_gov_share, na.rm=T),3), weighted.mean_19 = round(weighted.mean(CAP19, seat_gov_share, na.rm=T),3), weighted.mean_20 = round(weighted.mean(CAP20, seat_gov_share, na.rm=T),3), weighted.mean_21 = round(weighted.mean(CAP21, seat_gov_share, na.rm=T),3), weighted.mean_23 = round(weighted.mean(CAP23, seat_gov_share, na.rm=T),3), weighted.mean_24 = round(weighted.mean(CAP24, seat_gov_share, na.rm=T),3)) %>% ungroup()
#number of parties
gov_positions_final <- gov_positions_final %>% group_by(cabinet_id) %>% mutate(number_p = n())
save(gov_positions_final, file = "gov_positions_final.RData")
#dataset with positions of governments
governments_final <- gov_positions_final %>% distinct(cabinet_id, .keep_all = TRUE) %>% select(country_name_short, country_name, election_date, start_date, cabinet_name, country_id, election_id, cabinet_id, number_p, previous_cabinet_id, country, oecdmember, eumember, date, mean_1, mean_2, mean_3, mean_4, mean_5, mean_6, mean_7, mean_8, mean_9, mean_10, mean_12, mean_13, mean_14, mean_15, mean_16, mean_17, mean_18, mean_19, mean_20, mean_21, mean_23, mean_24, weighted.mean_1, weighted.mean_2, weighted.mean_3, weighted.mean_4, weighted.mean_5, weighted.mean_6, weighted.mean_7, weighted.mean_8, weighted.mean_9, weighted.mean_10, weighted.mean_12, weighted.mean_13, weighted.mean_14, weighted.mean_15, weighted.mean_16, weighted.mean_17, weighted.mean_18, weighted.mean_19, weighted.mean_20, weighted.mean_21, weighted.mean_23, weighted.mean_24)
save(governments_final, file = "governments_final.RData")
# variable shows whether we have a party record in morpor
gov_positions_final$missing <- NA
for (i in 1:nrow(gov_positions_final)) {
gov_positions_final$missing[i] <- ifelse(is.na(gov_positions_final$country[i]), 1, 0)
}
# how many parties from the cabinet are missing
gov_positions_final <- gov_positions_final %>% group_by(cabinet_id) %>% mutate(missing_cabinet = sum(missing, na.rm=TRUE)) %>% ungroup()
#plot
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
gov_positions_final$start_date <- ymd(gov_positions_final$start_date)
ggplot(gov_positions_final, aes(start_date, cabinet_id, size = number_p)) +
geom_point() +
geom_point(aes(size = ifelse(missing_cabinet == 0, NA, missing_cabinet), colour = "red")) +
scale_size_area() +
facet_wrap(~country_name) +
labs(y = NULL, x = NULL) +
scale_x_date(date_labels = "%Y") +
theme(axis.text.y = element_blank())
## Warning: Removed 384 rows containing missing values (geom_point).

#when knitting, France bubbles are not correct
governments_final %>% filter(country_name == "United Kingdom") %>% ggplot(aes(start_date, weighted.mean_20)) +
geom_point(aes(shape = factor(cabinet_name))) +
labs(shape = "Cabinet", y = "EU position", x = NULL)
## Warning: The shape palette can deal with a maximum of 6 discrete values
## because more than 6 becomes difficult to discriminate; you have 8.
## Consider specifying shapes manually if you must have them.
## Warning: Removed 2 rows containing missing values (geom_point).
