Skip to content

Instantly share code, notes, and snippets.

@becarioenmoncloa
Created September 15, 2011 19:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save becarioenmoncloa/1220246 to your computer and use it in GitHub Desktop.
Save becarioenmoncloa/1220246 to your computer and use it in GitHub Desktop.
Simulacion Elecciones 2011
*******************************************************************
** DO-FILE: simulacion de resultados de las elecciones de 2011
** Autor: becarioenmoncloa.com
*******************************************************************
clear all
set more off
set mem 300m
insheet using "http://www.becarioenmoncloa.com/datos_simulacion.csv", comma clear
save datos.dta, replace
** Paquete necesario para calcular distribucion de escanos
ssc install electool
*******************************************************************
** SIMULACION 1
** Supuesto: todos los votos que pierde el PSOE los gana el PP
*******************************************************************
qui foreach i of numlist 1(1)235{
** abro el archivo de datos
use datos.dta, clear
** fijo la diferencia entre PSOE y PP
local diferencia = .035 - .001 * `i'
** calculo pesos para ponderacion
gen dif_psoe_2011 = psoe2011 - (psoe2007 + psoe2003) /2
sum dif_psoe_2011 if partido == 14
gen peso = dif_psoe_2011 / `r(sum)'
drop psoe2011 - dif_psoe_2011
sum validos if partido == 14
local total_validos = r(sum)
gen distr_voto = validos / `total_validos'
gen peso2 = distr_voto * peso
sum peso2 if partido == 14
replace peso2 = peso2 / r(sum)
drop peso distr_voto
rename peso2 peso
** genero votos de psoe y pp
sum votos if partido == 14
local votos_psoe = r(sum)
sum votos if partido == 13
local votos_pp = r(sum)
local porc_psoe = `votos_psoe' / `total_validos'
local porc_pp = `votos_pp' / `total_validos'
** genero la perdida del psoe
local perdida = 1/2 * (`votos_psoe' - `votos_pp' - `diferencia' * `total_validos')
di `perdida'
gen perdida = `perdida' * peso
** calculo nueva distribucion de votos
** (asumo que todos los votos que pierde el PSOE van al PP)
gen votos_sim = votos - perdida if partido == 14
replace votos_sim = votos + perdida if partido == 13
replace votos_sim = votos if partido!=14 & partido!=13
** redondeo los votos
replace votos_sim = round(votos_sim,1)
gen diferencia = `diferencia'
** utilizando electool, calculo distribucion de escanos
v2seats votos_sim, party(partido) formula(dhondt) district(prov) size(magnitud) dthres(3) ///
nooutput save(resultados`i'.dta) preserve(prov diferencia)
** guardo los resultados de la simulacion
use resultados`i'.dta, clear
collapse (sum) dhondt (first) _diferencia, by(party)
rename _diferencia diferencia
gen supuesto = 1
save resultados`i'.dta, replace
}
** fusiono todos los resultados de la simulacion en un unico archivo
clear all
use resultados1.dta
qui foreach i of numlist 2(1)235{
append using resultados`i'.dta
erase resultados`i'.dta
}
save simulacion_1.dta, replace
*******************************************************************
** SIMULACION 2
** Supuesto: todos los votos que pierde el PSOE van a la abstencion
*******************************************************************
qui foreach i of numlist 1(1)235{
** abro el archivo de datos
use datos.dta, clear
** fijo la diferencia entre PSOE y PP
local diferencia = .035 - .001 * `i'
** calculo pesos para ponderacion
gen dif_psoe_2011 = psoe2011 - (psoe2007 + psoe2003) /2
sum dif_psoe_2011 if partido == 14
gen peso = dif_psoe_2011 / `r(sum)'
drop psoe2011 - dif_psoe_2011
sum validos if partido == 14
local total_validos = r(sum)
gen distr_voto = validos / `total_validos'
gen peso2 = distr_voto * peso
sum peso2 if partido == 14
replace peso2 = peso2 / r(sum)
drop peso distr_voto
rename peso2 peso
** genero votos de psoe y pp
sum votos if partido == 14
local votos_psoe = r(sum)
sum votos if partido == 13
local votos_pp = r(sum)
local porc_psoe = `votos_psoe' / `total_validos'
local porc_pp = `votos_pp' / `total_validos'
** genero la perdida del psoe
local perdida = (`votos_psoe' - `votos_pp' - `diferencia' * `total_validos')
di `perdida'
gen perdida = `perdida' * peso
** calculo nueva distribucion de votos
** (asumo que todos los votos que pierde el PSOE van a la abstencion)
gen votos_sim = votos - perdida if partido == 14
replace votos_sim = votos if partido!=14
** redondeo los votos
replace votos_sim = round(votos_sim,1)
gen diferencia = `diferencia'
** utilizando electool, calculo distribucion de escanos
v2seats votos_sim, party(partido) formula(dhondt) district(prov) size(magnitud) dthres(3) ///
nooutput save(resultados`i'.dta) preserve(prov diferencia)
** guardo los resultados de la simulacion
use resultados`i'.dta, clear
collapse (sum) dhondt (first) _diferencia, by(party)
rename _diferencia diferencia
gen supuesto = 2
save resultados`i'.dta, replace
}
** fusiono todos los resultados de la simulacion en un unico archivo
clear all
use resultados1.dta
qui foreach i of numlist 2(1)235{
append using resultados`i'.dta
erase resultados`i'.dta
}
save simulacion_2.dta, replace
*******************************************************************
** SIMULACION 3
** Supuesto: los votos van 1/3 PP, 1/3 abstencion, 1/3 otros part.
*******************************************************************
qui foreach i of numlist 1(1)235{
** abro el archivo de datos
use datos.dta, clear
** fijo la diferencia entre PSOE y PP
local diferencia = .035 - .001 * `i'
** calculo pesos para ponderacion
gen dif_psoe_2011 = psoe2011 - (psoe2007 + psoe2003) /2
sum dif_psoe_2011 if partido == 14
gen peso = dif_psoe_2011 / `r(sum)'
drop psoe2011 - dif_psoe_2011
sum validos if partido == 14
local total_validos = r(sum)
gen distr_voto = validos / `total_validos'
gen peso2 = distr_voto * peso
sum peso2 if partido == 14
replace peso2 = peso2 / r(sum)
drop peso distr_voto
rename peso2 peso
** genero votos de psoe y pp
sum votos if partido == 14
local votos_psoe = r(sum)
sum votos if partido == 13
local votos_pp = r(sum)
local porc_psoe = `votos_psoe' / `total_validos'
local porc_pp = `votos_pp' / `total_validos'
** genero la perdida del psoe
local perdida = 3/4 * (`votos_psoe' - `votos_pp' - `diferencia' * `total_validos')
*di `perdida'
gen perdida = `perdida' * peso
** calculo nueva distribucion de votos
** (asumo que todos 1/3 de los votos que pierde el PSOE van al PP,
** otro 1/3 a la abstencion, y otro 1/3 se divide equitativemente entre
** todos los terceros partidos importantes en cada provincia
** en las anteriores elecciones)
gen votos_sim = votos - perdida if partido == 14
replace votos_sim = votos + perdida / 3 if partido == 13
foreach j of numlist 1(1)52{
qui sum partido if prov == `j'
local partidos = `r(N)' - 2
qui levelsof partido if prov == `j' & partido != 14 & partido!= 13, local(partidos_d)
qui foreach k of local partidos_d{
replace votos_sim = votos + (perdida / 3) / `partidos' if prov == `j' & partido == `k' & perdida > 0
}
}
** redondeo los votos
replace votos_sim = round(votos_sim,1)
gen diferencia = `diferencia'
** utilizando electool, calculo distribucion de escanos
v2seats votos_sim, party(partido) formula(dhondt) district(prov) size(magnitud) dthres(3) ///
nooutput save(resultados`i'.dta) preserve(prov diferencia)
** guardo los resultados de la simulacion
use resultados`i'.dta, clear
collapse (sum) dhondt (first) _diferencia, by(party)
rename _diferencia diferencia
gen supuesto = 3
save resultados`i'.dta, replace
}
** fusiono todos los resultados de la simulacion en un unico archivo
clear all
use resultados1.dta
qui foreach i of numlist 2(1)235{
append using resultados`i'.dta
erase resultados`i'.dta
}
save simulacion_3.dta, replace
*******************************************************************
** PREPARACION DEL DATASET PARA GENERAR LOS GRAFICOS EN R
*******************************************************************
use simulacion_1.dta, clear
append using simulacion_2.dta
append using simulacion_3.dta
gen partido = ""
replace partido = "PSOE" if party == 14
replace partido = "PP" if party == 13
replace partido = "Otros" if partido == ""
collapse (sum) dhondt, by(partido supuesto diferencia)
replace diferencia = diferencia * -1
gen group = .
replace group = 1 if partido == "PSOE" & supuesto == 1
replace group = 2 if partido == "PSOE" & supuesto == 2
replace group = 3 if partido == "PSOE" & supuesto == 3
replace group = 4 if partido == "PP" & supuesto == 1
replace group = 5 if partido == "PP" & supuesto == 2
replace group = 6 if partido == "PP" & supuesto == 3
replace group = 7 if partido == "Otros" & supuesto == 1
replace group = 8 if partido == "Otros" & supuesto == 2
replace group = 0 if partido == "Otros" & supuesto == 3
outsheet using datos_grafico.csv, replace
erase simulacion_1.dta
erase simulacion_2.dta
erase simulacion_3.dta
erase datos.dta
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment