library(tidyverse)

ces <- rio::import("https://github.com/marctrussler/IIS-Data/raw/refs/heads/main/CES_VV.Rds", trust=T)

ces |> 
  group_by(year) |> 
  summarise(mean(voted.general))

ces|> 
  group_by(year, voted.general) |> 
  summarise(percent.dem = weighted.mean(approve.president, w=weight,na.rm=T)) |> 
  pivot_wider(names_from = voted.general, values_from=percent.dem)

ces |> 
  filter(year==2024) |> 
  group_by(turnout.intent) |> 
  summarise(n = n()) |> 
  mutate(freq = n/sum(n))

ces |> 
  filter(year==2024) |> 
  group_by(turnout.intent) |> 
  summarise(percent.voting = mean(voted.general,na.rm=T),
            n = n()) |> 
  mutate(freq = n/sum(n))


training <- ces |> 
  filter(year==2020) 

m1 <- lm(voted.general ~ sex + race + age4, data=training)
summary(m1)

test <- ces |> 
  filter(year==2024) 

test$vote.prob.lm <- predict(m1, newdata=test)
head(test$vote.prob.lm)

test |> 
  group_by(race) |> 
  summarise(avg.prob = mean(vote.prob.lm, na.rm=T))

boxplot(test$vote.prob.lm ~ test$voted.general)

#The 40% quantile is the value that 60% of data is higher than
quantile(test$vote.prob.lm,.4, na.rm=T)
#The fact that this is near 60% is a coincidence.

test |> 
  mutate(likely.voter.lm = if_else(vote.prob.lm>.608,T,F)) -> test

test |> 
  group_by(likely.voter.lm) |> 
  summarise(vote.prob = mean(voted.general,na.rm=T))

#Logit model on training data
m2 <- glm(voted.general ~ sex + race + age4, data=training, family="binomial")
summary(m2)
#Predict in test data
test$vote.prob.log <- predict.glm(m2, newdata = test, type="response")
#Cut based on top 60%
test |> 
  mutate(likely.voter.log = 
           if_else(vote.prob.log>quantile(test$vote.prob.log,.4, na.rm=T),T,F)) -> test
#See Results
test |> 
  group_by(likely.voter.log) |> 
  summarise(vote.prob = mean(voted.general,na.rm=T))



training <- ces |> 
  filter(year %in% c(2012, 2016, 2020))
#Logit model on training data
m2 <- glm(voted.general ~ sex + race + age4, data=training, family="binomial")
summary(m2)
#Predict in test data
test$vote.prob.log <- predict.glm(m2, newdata = test, type="response")
#Cut based on top 60%
test |> 
  mutate(likely.voter.log = 
           if_else(vote.prob.log>quantile(test$vote.prob.log,.4, na.rm=T),T,F)) -> test
#See Results
test |> 
  group_by(likely.voter.log) |> 
  summarise(vote.prob = mean(voted.general,na.rm=T))



training <- ces |> 
  filter(year %in% c(2012, 2016, 2020))
#Logit model on training data
m2 <- glm(voted.general ~ sex + race + age4 + registered + educ, data=training, family="binomial")
summary(m2)
#Predict in test data
test$vote.prob.log <- predict.glm(m2, newdata = test, type="response")
#Cut based on top 60%
test |> 
  mutate(likely.voter.log = 
           if_else(vote.prob.log>quantile(test$vote.prob.log,.4, na.rm=T),T,F)) -> test
#See Results
test |> 
  group_by(likely.voter.log) |> 
  summarise(vote.prob = mean(voted.general,na.rm=T))



training <- ces |> 
  filter(year %in% c(2012, 2016, 2020))
#Logit model on training data
m2 <- glm(voted.general ~ sex + race + age4 + registered + educ + pid5, data=training, family="binomial")
summary(m2)
#Predict in test data
test$vote.prob.log <- predict.glm(m2, newdata = test, type="response")
#Cut based on top 60%
test |> 
  mutate(likely.voter.log = 
           if_else(vote.prob.log>quantile(test$vote.prob.log,.4, na.rm=T),T,F)) -> test
#See Results
test |> 
  group_by(likely.voter.log) |> 
  summarise(vote.prob = mean(voted.general,na.rm=T))



training <- ces |> 
  filter(year %in% c(2012, 2016, 2020))
#Logit model on training data
m2 <- glm(voted.general ~ sex + race + age4 + registered + educ + voted.primary, data=training, family="binomial")
summary(m2)

#Predict in test data
test$vote.prob.log <- predict.glm(m2, newdata = test, type="response")
#Cut based on top 60%
test |> 
  mutate(likely.voter.log = 
           if_else(vote.prob.log>quantile(test$vote.prob.log,.4, na.rm=T),T,F)) -> test
#See Results
test |> 
  group_by(likely.voter.log) |> 
  summarise(vote.prob = mean(voted.general,na.rm=T))



pewmethods::get_totals("vote.choice.president",test, "weight",na.rm=T)

test |> 
  mutate(weight.lv = weight*likely.voter.log) -> test

pewmethods::get_totals("vote.choice.president",test, "weight.lv",na.rm=T)


test |> 
  mutate(weight.lv2 = weight*vote.prob.log) -> test

pewmethods::get_totals("vote.choice.president",test, "weight.lv",na.rm=T)

sum(test$weight.lv,na.rm=T)
sum(test$weight.lv2,na.rm=T)

pewmethods::calculate_deff(test$weight)
pewmethods::calculate_deff(test$weight.lv)
pewmethods::calculate_deff(test$weight.lv2)

sm <- rio::import("https://github.com/marctrussler/IIS-Data/raw/refs/heads/main/NBCAug25Weighted.Rds", trust=T)
