# Load packages
library(tidyverse)
library(caret)
library(glmnet)
library(pROC)
library(randomForest)
# Load and preprocess training data
train <- read_csv("fundraising.csv") %>%
  mutate(
    target = ifelse(target == "No Donor", "No_Donor", target),
    target = factor(target, levels = c("No_Donor", "Donor")),
    across(c(zipconvert2:zipconvert5, homeowner, female), as.factor)
  )
# Load and preprocess test data
test <- read_csv("future_fundraising.csv") %>%
  mutate(across(c(zipconvert2:zipconvert5, homeowner, female), as.factor))
# Split 80/20
set.seed(12345)
split <- createDataPartition(train$target, p = 0.8, list = FALSE)
train_data <- na.omit(train[split, ])
valid_data <- na.omit(train[-split, ])
# Set caret training control (no CV)
ctrl <- trainControl(method = "none", classProbs = TRUE, savePredictions = TRUE)

# --- Model 1: Full Logistic Regression ---
model_log_full <- train(
  target ~ ., data = train_data, method = "glm",
  family = "binomial", trControl = ctrl
)
# --- Model 2: Top Predictors Logistic ---
model_log_top <- train(
  target ~ lifetime_gifts + months_since_donate + avg_gift + income + wealth,
  data = train_data, method = "glm",
  family = "binomial", trControl = ctrl
)
# --- Model 3: Interaction Terms Logistic ---
model_log_interact <- train(
  target ~ income * wealth + lifetime_gifts * months_since_donate,
  data = train_data, method = "glm",
  family = "binomial", trControl = ctrl
)
# --- Model 4: Lasso Logistic Regression (glmnet with alpha = 1) ---
model_lasso <- train(
  target ~ ., data = train_data, method = "glmnet",
  trControl = ctrl,
  tuneGrid = expand.grid(alpha = 1, lambda = 0.01),
  family = "binomial"
)
# --- Model 5: Ridge Logistic Regression (glmnet with alpha = 0) ---
model_ridge <- train(
  target ~ ., data = train_data, method = "glmnet",
  trControl = ctrl,
  tuneGrid = expand.grid(alpha = 0, lambda = 0.01),
  family = "binomial"
)
# --- Model 6: Random Forest ---
model_rf <- train(
  target ~ ., data = train_data, method = "rf",
  trControl = ctrl, ntree = 500
)
# --- Model 7: Random Forest ---
model_rf2 <- train(
  target ~ income + wealth + months_since_donate, data = train_data, method = "rf",
  trControl = ctrl, ntree = 500
)
# --- Model 8: Naive Bias and Boot ---

#define training control

train_naiveBias <- trainControl(method="boot", number = 100)

#train the model

model_naiveBias <- train(target ~ income + wealth + months_since_donate, data = train_data, method = "nb",trControl = train_naiveBias)
LS0tDQp0aXRsZTogIkZ1bmRyYWlzaW5nIHByb2plY3QgQWxsdGhlU0FTIENhbURvbUFsaSINCm91dHB1dDoNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1UUlVFLCB3YXJuaW5nID0gRkFMU0UpDQoNCmBgYA0KDQpgYGB7cn0NCiMgTG9hZCBwYWNrYWdlcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShnbG1uZXQpDQpsaWJyYXJ5KHBST0MpDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCmBgYA0KDQpgYGB7cn0NCiMgTG9hZCBhbmQgcHJlcHJvY2VzcyB0cmFpbmluZyBkYXRhDQp0cmFpbiA8LSByZWFkX2NzdigiZnVuZHJhaXNpbmcuY3N2IikgJT4lDQogIG11dGF0ZSgNCiAgICB0YXJnZXQgPSBpZmVsc2UodGFyZ2V0ID09ICJObyBEb25vciIsICJOb19Eb25vciIsIHRhcmdldCksDQogICAgdGFyZ2V0ID0gZmFjdG9yKHRhcmdldCwgbGV2ZWxzID0gYygiTm9fRG9ub3IiLCAiRG9ub3IiKSksDQogICAgYWNyb3NzKGMoemlwY29udmVydDI6emlwY29udmVydDUsIGhvbWVvd25lciwgZmVtYWxlKSwgYXMuZmFjdG9yKQ0KICApDQpgYGANCg0KYGBge3J9DQojIExvYWQgYW5kIHByZXByb2Nlc3MgdGVzdCBkYXRhDQp0ZXN0IDwtIHJlYWRfY3N2KCJmdXR1cmVfZnVuZHJhaXNpbmcuY3N2IikgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyh6aXBjb252ZXJ0Mjp6aXBjb252ZXJ0NSwgaG9tZW93bmVyLCBmZW1hbGUpLCBhcy5mYWN0b3IpKQ0KYGBgDQoNCg0KYGBge3J9DQojIFNwbGl0IDgwLzIwDQpzZXQuc2VlZCgxMjM0NSkNCnNwbGl0IDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24odHJhaW4kdGFyZ2V0LCBwID0gMC44LCBsaXN0ID0gRkFMU0UpDQp0cmFpbl9kYXRhIDwtIG5hLm9taXQodHJhaW5bc3BsaXQsIF0pDQp2YWxpZF9kYXRhIDwtIG5hLm9taXQodHJhaW5bLXNwbGl0LCBdKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTZXQgY2FyZXQgdHJhaW5pbmcgY29udHJvbCAobm8gQ1YpDQpjdHJsIDwtIHRyYWluQ29udHJvbChtZXRob2QgPSAibm9uZSIsIGNsYXNzUHJvYnMgPSBUUlVFLCBzYXZlUHJlZGljdGlvbnMgPSBUUlVFKQ0KDQojIC0tLSBNb2RlbCAxOiBGdWxsIExvZ2lzdGljIFJlZ3Jlc3Npb24gLS0tDQptb2RlbF9sb2dfZnVsbCA8LSB0cmFpbigNCiAgdGFyZ2V0IH4gLiwgZGF0YSA9IHRyYWluX2RhdGEsIG1ldGhvZCA9ICJnbG0iLA0KICBmYW1pbHkgPSAiYmlub21pYWwiLCB0ckNvbnRyb2wgPSBjdHJsDQopDQpgYGANCg0KYGBge3J9DQojIC0tLSBNb2RlbCAyOiBUb3AgUHJlZGljdG9ycyBMb2dpc3RpYyAtLS0NCm1vZGVsX2xvZ190b3AgPC0gdHJhaW4oDQogIHRhcmdldCB+IGxpZmV0aW1lX2dpZnRzICsgbW9udGhzX3NpbmNlX2RvbmF0ZSArIGF2Z19naWZ0ICsgaW5jb21lICsgd2VhbHRoLA0KICBkYXRhID0gdHJhaW5fZGF0YSwgbWV0aG9kID0gImdsbSIsDQogIGZhbWlseSA9ICJiaW5vbWlhbCIsIHRyQ29udHJvbCA9IGN0cmwNCikNCg0KYGBgDQoNCmBgYHtyfQ0KIyAtLS0gTW9kZWwgMzogSW50ZXJhY3Rpb24gVGVybXMgTG9naXN0aWMgLS0tDQptb2RlbF9sb2dfaW50ZXJhY3QgPC0gdHJhaW4oDQogIHRhcmdldCB+IGluY29tZSAqIHdlYWx0aCArIGxpZmV0aW1lX2dpZnRzICogbW9udGhzX3NpbmNlX2RvbmF0ZSwNCiAgZGF0YSA9IHRyYWluX2RhdGEsIG1ldGhvZCA9ICJnbG0iLA0KICBmYW1pbHkgPSAiYmlub21pYWwiLCB0ckNvbnRyb2wgPSBjdHJsDQopDQoNCmBgYA0KDQpgYGB7cn0NCiMgLS0tIE1vZGVsIDQ6IExhc3NvIExvZ2lzdGljIFJlZ3Jlc3Npb24gKGdsbW5ldCB3aXRoIGFscGhhID0gMSkgLS0tDQptb2RlbF9sYXNzbyA8LSB0cmFpbigNCiAgdGFyZ2V0IH4gLiwgZGF0YSA9IHRyYWluX2RhdGEsIG1ldGhvZCA9ICJnbG1uZXQiLA0KICB0ckNvbnRyb2wgPSBjdHJsLA0KICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKGFscGhhID0gMSwgbGFtYmRhID0gMC4wMSksDQogIGZhbWlseSA9ICJiaW5vbWlhbCINCikNCg0KYGBgDQoNCmBgYHtyfQ0KIyAtLS0gTW9kZWwgNTogUmlkZ2UgTG9naXN0aWMgUmVncmVzc2lvbiAoZ2xtbmV0IHdpdGggYWxwaGEgPSAwKSAtLS0NCm1vZGVsX3JpZGdlIDwtIHRyYWluKA0KICB0YXJnZXQgfiAuLCBkYXRhID0gdHJhaW5fZGF0YSwgbWV0aG9kID0gImdsbW5ldCIsDQogIHRyQ29udHJvbCA9IGN0cmwsDQogIHR1bmVHcmlkID0gZXhwYW5kLmdyaWQoYWxwaGEgPSAwLCBsYW1iZGEgPSAwLjAxKSwNCiAgZmFtaWx5ID0gImJpbm9taWFsIg0KKQ0KYGBgDQoNCmBgYHtyfQ0KIyAtLS0gTW9kZWwgNjogUmFuZG9tIEZvcmVzdCAtLS0NCm1vZGVsX3JmIDwtIHRyYWluKA0KICB0YXJnZXQgfiAuLCBkYXRhID0gdHJhaW5fZGF0YSwgbWV0aG9kID0gInJmIiwNCiAgdHJDb250cm9sID0gY3RybCwgbnRyZWUgPSA1MDANCikNCmBgYA0KDQoNCmBgYHtyfQ0KIyAtLS0gTW9kZWwgNzogUmFuZG9tIEZvcmVzdCAtLS0NCm1vZGVsX3JmMiA8LSB0cmFpbigNCiAgdGFyZ2V0IH4gaW5jb21lICsgd2VhbHRoICsgbW9udGhzX3NpbmNlX2RvbmF0ZSwgZGF0YSA9IHRyYWluX2RhdGEsIG1ldGhvZCA9ICJyZiIsDQogIHRyQ29udHJvbCA9IGN0cmwsIG50cmVlID0gNTAwDQopDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyAtLS0gTW9kZWwgODogTmFpdmUgQmlhcyBhbmQgQm9vdCAtLS0NCg0KI2RlZmluZSB0cmFpbmluZyBjb250cm9sDQoNCnRyYWluX25haXZlQmlhcyA8LSB0cmFpbkNvbnRyb2wobWV0aG9kPSJib290IiwgbnVtYmVyID0gMTAwKQ0KDQojdHJhaW4gdGhlIG1vZGVsDQoNCm1vZGVsX25haXZlQmlhcyA8LSB0cmFpbih0YXJnZXQgfiBpbmNvbWUgKyB3ZWFsdGggKyBtb250aHNfc2luY2VfZG9uYXRlLCBkYXRhID0gdHJhaW5fZGF0YSwgbWV0aG9kID0gIm5iIix0ckNvbnRyb2wgPSB0cmFpbl9uYWl2ZUJpYXMpDQoNCg0KI3N1bW1hcml6ZSByZXN1bHRzDQoNCnByaW50KG1vZGVsX25haXZlQmlhcykNCg0KYGBgDQoNCg0KYGBge3J9DQojIC0tLSBNb2RlbCA5OiBrLWZvbGQgY3Jvc3MgdmFsaWRhdGlvbiAtLS0NCg0KI2RlZmluZSB0cmFpbmluZyBjb250cm9sDQoNCnRyYWluX2tGb2xkQ1YgPC0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXIgPSAxMCkNCg0KI3RyYWluIHRoZSBtb2RlbA0KDQptb2RlbF9rRm9sZENWIDwtIHRyYWluKHRhcmdldCB+IGluY29tZSArIHdlYWx0aCArIG1vbnRoc19zaW5jZV9kb25hdGUsIGRhdGEgPSB0cmFpbl9kYXRhLCBtZXRob2QgPSAibmIiLHRyQ29udHJvbCA9IHRyYWluX2tGb2xkQ1YpDQoNCg0KI3N1bW1hcml6ZSByZXN1bHRzDQoNCnByaW50KG1vZGVsX2tGb2xkQ1YpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQojIC0tLSBNb2RlbCAxMDogUmVwZWF0ZWQgay1mb2xkIGNyb3NzIHZhbGlkYXRpb24gLS0tDQoNCiNkZWZpbmUgdHJhaW5pbmcgY29udHJvbA0KDQp0cmFpbl9ScHRka0ZvbGRDViA8LSB0cmFpbkNvbnRyb2wobWV0aG9kPSJyZXBlYXRlZGN2IiwgbnVtYmVyID0gMTAsIHJlcGVhdHMgPTMpDQoNCiN0cmFpbiB0aGUgbW9kZWwNCg0KbW9kZWxfUnB0ZGtGb2xkQ1YgPC0gdHJhaW4odGFyZ2V0IH4gaW5jb21lICsgd2VhbHRoICsgbW9udGhzX3NpbmNlX2RvbmF0ZSwgZGF0YSA9IHRyYWluX2RhdGEsIG1ldGhvZCA9ICJuYiIsdHJDb250cm9sID0gdHJhaW5fUnB0ZGtGb2xkQ1YpDQoNCg0KI3N1bW1hcml6ZSByZXN1bHRzDQoNCnByaW50KG1vZGVsX2tGb2xkQ1YpDQoNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgLS0tIE1vZGVsIDExOiBMZWF2ZSBPbmUgT3V0IENyb3NzIHZhbGlkYXRpb24gLS0tDQoNCiNkZWZpbmUgdHJhaW5pbmcgY29udHJvbA0KDQp0cmFpbl9MT09DViA8LSB0cmFpbkNvbnRyb2wobWV0aG9kPSJMT09DViIpDQoNCiN0cmFpbiB0aGUgbW9kZWwNCg0KbW9kZWxfTE9PQ1YgPC0gdHJhaW4odGFyZ2V0IH4gaW5jb21lICsgd2VhbHRoICsgbW9udGhzX3NpbmNlX2RvbmF0ZSwgZGF0YSA9IHRyYWluX2RhdGEsIG1ldGhvZCA9ICJuYiIsdHJDb250cm9sID0gdHJhaW5fTE9PQ1YpDQoNCg0KI3N1bW1hcml6ZSByZXN1bHRzDQoNCnByaW50KG1vZGVsX0xPT0NWKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyAtLS0gRXZhbHVhdGUgQWxsIE1vZGVscyAtLS0NCnJlc3VsdHMgPC0gbGlzdCgNCiAgIkxvZ2lzdGljIEZ1bGwiID0gZXZhbHVhdGVfbW9kZWwobW9kZWxfbG9nX2Z1bGwsIHZhbGlkX2RhdGEpLA0KICAiTG9naXN0aWMgVG9wIFByZWRpY3RvcnMiID0gZXZhbHVhdGVfbW9kZWwobW9kZWxfbG9nX3RvcCwgdmFsaWRfZGF0YSksDQogICJMb2dpc3RpYyBJbnRlcmFjdGlvbnMiID0gZXZhbHVhdGVfbW9kZWwobW9kZWxfbG9nX2ludGVyYWN0LCB2YWxpZF9kYXRhKSwNCiAgIkxhc3NvIExvZ2lzdGljIiA9IGV2YWx1YXRlX21vZGVsKG1vZGVsX2xhc3NvLCB2YWxpZF9kYXRhKSwNCiAgIlJpZGdlIExvZ2lzdGljIiA9IGV2YWx1YXRlX21vZGVsKG1vZGVsX3JpZGdlLCB2YWxpZF9kYXRhKSwNCiAgIlJhbmRvbSBGb3Jlc3QiID0gZXZhbHVhdGVfbW9kZWwobW9kZWxfcmYsIHZhbGlkX2RhdGEpLA0KICAiUmFuZG9tIEZvcmVzdDIiID0gZXZhbHVhdGVfbW9kZWwobW9kZWxfcmYyLCB2YWxpZF9kYXRhKSwNCiAgIk5haXZlIEJpYXMiID0gZXZhbHVhdGVfbW9kZWwobW9kZWxfbmFpdmVCaWFzLCB2YWxpZF9kYXRhKSwNCiAgIkstZm9sZCBDViIgPSBldmFsdWF0ZV9tb2RlbChtb2RlbF9rRm9sZENWLHZhbGlkX2RhdGEpLA0KICAiUmVwZWF0ZWQgSy1mb2xkIENWIiA9ZXZhbHVhdGVfbW9kZWwobW9kZWxfa0ZvbGRDViwgdmFsaWRfZGF0YSksDQogICJMZWF2ZSBPbmUgT3V0IENWIiA9IGV2YWx1YXRlX21vZGVsKG1vZGVsX0xPT0NWLCB2YWxpZF9kYXRhKSkNCiAgDQogIA0KYGBgDQoNCmBgYHtyfQ0KI1ByaW50IEFVQ3MNCmNhdCgiXG49PT0gQVVDIFNjb3JlcyBieSBNb2RlbCA9PT1cbiIpDQoNCmBgYA0KICANCiAgDQpgYGB7cn0NCg0KcHJpbnQoc2FwcGx5KHJlc3VsdHMsIGZ1bmN0aW9uKHgpIHgkQVVDKSkNCg0KDQpgYGANCiAgDQpgYGB7cn0NCiMgLS0tIFByZWRpY3Qgb24gZnV0dXJlIHRlc3Qgc2V0IHVzaW5nIGJlc3QgbW9kZWwgKFJhbmRvbSBGb3Jlc3QpIC0tLQ0KcmZfdGVzdF9wcmVkcyA8LSBwcmVkaWN0KG1vZGVsX3JmLCBuZXdkYXRhID0gdGVzdCkNCg0KYGBgDQoNCg0KYGBge3J9DQojIC0tLSBFeHBvcnQgc3VibWlzc2lvbiBmaWxlIC0tLQ0Kc3VibWlzc2lvbiA8LSB0aWJibGUodmFsdWUgPSByZl90ZXN0X3ByZWRzKQ0Kd3JpdGVfY3N2KHN1Ym1pc3Npb24sICJzdWJtaXNzaW9uLmNzdiIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQo=