setwd("D:/charls/")
library(lme4)
library(lmerTest)
library(haven)
library(tidyverse)
library(lm.beta)
library(tableone)
library(charlsMAX)
library(httr)
library(interactions)
library(jtools)
base <- read.csv("base.csv")

base$green_space <- scale(base$NDVI)
base$pollutant_PM2.5 <- scale(base$PM2.5)   
base$pollutant_SO2 <- scale(base$SO2)   
base$pollutant_NO2 <- scale(base$NO2)   
NDVI_PM2.5_result <- glm(
  blood ~ green_space*pollutant_PM2.5 + age + sex + marriage + house + activity + smoke + drink + health + sleep + depression + BMI, 
  family = binomial,
  data = base
)
summary(NDVI_PM2.5_result)
exp(NDVI_PM2.5_result$coefficients)
exp(confint(NDVI_PM2.5_result))
exp(coef(NDVI_PM2.5_result))

interact_plot(
  NDVI_PM2.5_result, 
  pred = pollutant_PM2.5,    
  modx = green_space,       
  modx.values =c(-1,0,1),
  main = "",
  x.label = "PM2.5",
  y.label = "Cardiovascular risk",
  legend.main = "  Level of green 
  space exposure",
  modx.labels = c("Low Level", "Medium Level", "High Level")
) + 
  theme(
    text = element_text(size = 20),
    plot.title = element_text(size = 20, hjust = 0.5),
    axis.title = element_text(size = 18),
    legend.title = element_text(size = 18),
    legend.text = element_text(size = 16)
  )

model_coefs <- coef(NDVI_PM2.5_result)
model_vcov <- vcov(NDVI_PM2.5_result)

green_levels <- c(-1, 0, 1)
green_levels_names <- c("Low (-1 SD)", "Medium (Mean)", "High (+1 SD)")

pm25_effect <- model_coefs["pollutant_PM2.5"]
interaction_term <- model_coefs["green_space:pollutant_PM2.5"]

results_df <- data.frame(
  green_space_level = green_levels_names,
  green_space_value = green_levels
)

conditional_effects <- numeric(length(green_levels))
conditional_se <- numeric(length(green_levels))
confidence_intervals <- matrix(NA, nrow = length(green_levels), ncol = 2)
colnames(confidence_intervals) <- c("CI_lower", "CI_upper")

for(i in seq_along(green_levels)) {
  g <- green_levels[i]
  
  cond_effect <- pm25_effect + interaction_term * g
  
  var_pm25 <- model_vcov["pollutant_PM2.5", "pollutant_PM2.5"]
  var_interaction <- model_vcov["green_space:pollutant_PM2.5", "green_space:pollutant_PM2.5"]
  cov_pm25_interaction <- model_vcov["pollutant_PM2.5", "green_space:pollutant_PM2.5"]
  
  var_cond_effect <- var_pm25 + (g^2 * var_interaction) + (2 * g * cov_pm25_interaction)
  se_cond_effect <- sqrt(var_cond_effect)
  
  conditional_effects[i] <- cond_effect
  conditional_se[i] <- se_cond_effect
  
  z_value <- qnorm(0.975)
  ci_lower <- cond_effect - z_value * se_cond_effect
  ci_upper <- cond_effect + z_value * se_cond_effect
  
  confidence_intervals[i, ] <- c(ci_lower, ci_upper)
}

results_df$conditional_effect <- conditional_effects
results_df$conditional_se <- conditional_se
results_df$OR <- exp(conditional_effects)
results_df$OR_lower <- exp(confidence_intervals[, "CI_lower"])
results_df$OR_upper <- exp(confidence_intervals[, "CI_upper"])

print(results_df)

#绿地*SO2
NDVI_SO2_result <- glm(
  blood ~ green_space*pollutant_SO2 + age + sex + marriage + house + activity + smoke + drink + health + sleep + depression + BMI, 
  family = binomial,
  data = base
)
summary(NDVI_SO2_result)
exp(NDVI_SO2_result$coefficients)
exp(confint(NDVI_SO2_result))
exp(coef(NDVI_SO2_result))

interact_plot(
  NDVI_SO2_result, 
  pred = pollutant_SO2,  
  modx = green_space,
  modx.values =c(-1,0,1),
  main = "",
  x.label = "SO2",
  y.label = "Cardiovascular risk",
  legend.main = "  Level of green 
  space exposure"
) +
  theme(
    text = element_text(size = 20),
    plot.title = element_text(size = 20, hjust = 0.5),
    axis.title = element_text(size = 18),
    legend.title = element_text(size = 18),
    legend.text = element_text(size = 16)
  )

model_coefs <- coef(NDVI_SO2_result)
model_vcov <- vcov(NDVI_SO2_result)

green_levels <- c(-1, 0, 1)
green_levels_names <- c("Low (-1 SD)", "Medium (Mean)", "High (+1 SD)")

so2_effect <- model_coefs["pollutant_SO2"]
interaction_term <- model_coefs["green_space:pollutant_SO2"]

results_df <- data.frame(
  green_space_level = green_levels_names,
  green_space_value = green_levels
)

conditional_effects <- numeric(length(green_levels))
conditional_se <- numeric(length(green_levels))
confidence_intervals <- matrix(NA, nrow = length(green_levels), ncol = 2)
colnames(confidence_intervals) <- c("CI_lower", "CI_upper")

for(i in seq_along(green_levels)) {
  g <- green_levels[i]
  
  cond_effect <- so2_effect + interaction_term * g
  
  var_SO2 <- model_vcov["pollutant_SO2", "pollutant_SO2"]
  var_interaction <- model_vcov["green_space:pollutant_SO2", "green_space:pollutant_SO2"]
  cov_SO2_interaction <- model_vcov["pollutant_SO2", "green_space:pollutant_SO2"]
  
  var_cond_effect <- var_SO2 + (g^2 * var_interaction) + (2 * g * cov_SO2_interaction)
  se_cond_effect <- sqrt(var_cond_effect)
  
  conditional_effects[i] <- cond_effect
  conditional_se[i] <- se_cond_effect
  
  z_value <- qnorm(0.975)  # 1.96 for 95% CI
  ci_lower <- cond_effect - z_value * se_cond_effect
  ci_upper <- cond_effect + z_value * se_cond_effect
  
  confidence_intervals[i, ] <- c(ci_lower, ci_upper)
}

results_df$conditional_effect <- conditional_effects
results_df$conditional_se <- conditional_se
results_df$OR <- exp(conditional_effects)
results_df$OR_lower <- exp(confidence_intervals[, "CI_lower"])
results_df$OR_upper <- exp(confidence_intervals[, "CI_upper"])

print(results_df)



#绿地*NO2
NDVI_NO2_result <- glm(
  blood ~ green_space*pollutant_NO2 + age + sex + marriage + house + activity + smoke + drink + health + sleep + depression + BMI, 
  family = binomial,
  data = base
)
summary(NDVI_NO2_result)
exp(NDVI_NO2_result$coefficients)
exp(confint(NDVI_NO2_result))
exp(coef(NDVI_NO2_result))

interact_plot(
  NDVI_NO2_result, 
  pred = pollutant_NO2,
  modx = green_space,
  modx.values =c(-1,0,1),
  main = "",
  x.label = "NO2",
  y.label = "Cardiovascular risk",
  legend.main = "  Level of green 
  space exposure"
) +
  theme(
    text = element_text(size = 20),
    plot.title = element_text(size = 20, hjust = 0.5),
    axis.title = element_text(size = 18),
    legend.title = element_text(size = 18),
    legend.text = element_text(size = 16)
  )

model_coefs <- coef(NDVI_NO2_result)
model_vcov <- vcov(NDVI_NO2_result)

green_levels <- c(-1, 0, 1)
green_levels_names <- c("Low (-1 SD)", "Medium (Mean)", "High (+1 SD)")

no2_effect <- model_coefs["pollutant_NO2"]
interaction_term <- model_coefs["green_space:pollutant_NO2"]

results_df <- data.frame(
  green_space_level = green_levels_names,
  green_space_value = green_levels
)

conditional_effects <- numeric(length(green_levels))
conditional_se <- numeric(length(green_levels))
confidence_intervals <- matrix(NA, nrow = length(green_levels), ncol = 2)
colnames(confidence_intervals) <- c("CI_lower", "CI_upper")

for(i in seq_along(green_levels)) {
  g <- green_levels[i]
  
  cond_effect <- no2_effect + interaction_term * g
  
  var_NO2 <- model_vcov["pollutant_NO2", "pollutant_NO2"]
  var_interaction <- model_vcov["green_space:pollutant_NO2", "green_space:pollutant_NO2"]
  cov_NO2_interaction <- model_vcov["pollutant_NO2", "green_space:pollutant_NO2"]
  
  var_cond_effect <- var_NO2 + (g^2 * var_interaction) + (2 * g * cov_NO2_interaction)
  se_cond_effect <- sqrt(var_cond_effect)
  
  conditional_effects[i] <- cond_effect
  conditional_se[i] <- se_cond_effect
  
  z_value <- qnorm(0.975)  # 1.96 for 95% CI
  ci_lower <- cond_effect - z_value * se_cond_effect
  ci_upper <- cond_effect + z_value * se_cond_effect
  
  confidence_intervals[i, ] <- c(ci_lower, ci_upper)
}

results_df$conditional_effect <- conditional_effects
results_df$conditional_se <- conditional_se
results_df$OR <- exp(conditional_effects)
results_df$OR_lower <- exp(confidence_intervals[, "CI_lower"])
results_df$OR_upper <- exp(confidence_intervals[, "CI_upper"])

print(results_df)
