lmer混合线性模型如何计算每个国家分组对应的R-squared值
混合线性模型各国家R平方计算方法
你需要的每个国家对应R²的核心计算逻辑为:针对每个国家的所有观测样本,计算原始Gini值和模型给出的对应预测值的平方相关系数,该值即为该国家层面模型的拟合优度。predict(modelF)默认会调用每个国家的随机截距、随机斜率计算预测值,和你从coef(modelF)拿到的国家层面系数计算得到的拟合值完全一致,因此可以直接基于预测值完成计算。
方法1:基于tidyverse实现(代码更简洁)
library(dplyr) # 1. 给原数据拼接模型预测值 data1_pred <- data1 %>% mutate(pred_Gini = predict(modelF)) # 2. 按国家分组计算R²,同时输出每个国家的观测数用于结果校验 country_r2 <- data1_pred %>% group_by(Country) %>% summarise( r_squared = cor(Gini, pred_Gini)^2, observation_count = n() ) # 输出结果 print(country_r2, n = Inf) # n=Inf可以输出所有国家的结果
方法2:基于基础R实现(无需额外加载包)
# 1. 给原数据拼接模型预测值 data1$pred_Gini <- predict(modelF) # 2. 按国家拆分数据并计算每个分组的R² country_r2_list <- by(data1, data1$Country, function(sub_data) { # 过滤掉存在缺失值的行 sub_data_clean <- na.omit(sub_data[, c("Gini", "pred_Gini")]) # 样本量小于3的分组返回NA避免结果失真 if(nrow(sub_data_clean) < 3) return(NA) return(cor(sub_data_clean$Gini, sub_data_clean$pred_Gini)^2) }) # 3. 把结果转为数据框方便查看 country_r2 <- data.frame( Country = names(country_r2_list), r_squared = as.numeric(country_r2_list) ) # 输出结果 print(country_r2)
注意事项
- 如果某个国家的有效观测数≤2,计算得到的R²会接近1,没有实际参考意义,建议过滤掉这部分结果
- 这里计算的是条件R²的分组版本,用到了每个国家的随机效应估计值,反映的是模型对单个国家Gini变化的解释能力
内容的提问来源于stack exchange,提问作者Jinane Jouni
相关产品推荐
相关产品推荐

