面板数据PLM线性概率模型计算ROC/AUC报错问题咨询
PLM模型计算ROC/AUC报错问题说明与解决
问题背景
我持有102个国家约20-40年(依国家不同存在差异)的对外资产面板数据,试图基于log(total_liabilities)预测金融危机发生概率,验证外资及其他资本头寸增长是否有助于危机预判。
我首先构建PLM模型对危机哑变量进行回归,代码如下:
plm1 <- plm(crisis ~ log_total_liabilities + lag1_log_tot_lia + lag2_log_tot_lia + lag3_log_tot_lia + factor(year) + factor(country), data = dt2, index=c("year", "country"), model="pooling") summary(plm1)
为评估模型预测能力,我尝试基于回归结果生成ROC曲线和AUC值,运行代码如下:
# 绘制真正率随假正率变化的ROC曲线 pred1 <- predict(plm1) pred2 <- prediction(pred1,as.numeric(plm1$crisis)) plot(performance(pred2,"tpr","fpr"), las=0, main="plm1")
运行后收到报错,德语翻译为“参数/变量不匹配”或“所有参数/变量长度需一致”。我将pred1代码修改为pred1 <- predict(plm1, dt2)(dt2为我的数据框,包含部分未参与plm1回归的变量),又收到新报错:“预测结果格式无效,无法强制转换为列表”。
我想咨询:PLM模型本身不支持ROC计算吗?如果不支持,为何我附上的论文中给出了带固定效应的线性概率模型的AUROC值?如果支持,我的操作哪里存在问题?
问题解答
核心结论
PLM模型完全支持后续计算ROC/AUC,论文中带固定效应的线性概率模型可输出AUROC值属于常规操作:ROC/AUC的计算仅需要真实分类标签和对应的预测评分两个等长序列,和你用什么工具跑回归没有关联,线性概率模型输出的预测值即使超出0-1区间也不影响排序逻辑,可正常计算AUROC。
报错原因
- 第一次报错(参数长度不匹配):plm模型的返回对象不会直接存储原始被解释变量列,你调用
plm1$crisis实际返回的是NULL,和预测值pred1长度不一致触发报错。 - 第二次报错(预测结果格式无效):plm包的predict方法对新数据的输入格式有严格要求,你的dt2中存在回归时被剔除的缺失值样本、或因子变量(year、country)存在训练集没有的水平,都会导致预测输出格式异常。
修正代码
# 提取回归实际使用样本的真实危机标签 real_crisis <- as.numeric(plm1$model$crisis) # 提取训练集样本的预测值 pred_score <- predict(plm1) # 验证两者长度一致,正常应返回TRUE length(pred_score) == length(real_crisis) # 生成ROC对象(使用ROCR包) roc_pred <- prediction(pred_score, real_crisis) # 绘制ROC曲线 plot(performance(roc_pred, "tpr", "fpr"), las=1, main="双向固定效应线性概率模型ROC曲线") # 提取AUC值 auc_val <- performance(roc_pred, "auc")@y.values[[1]] cat("模型AUC值为:", round(auc_val, 4), "\n")
注意事项
- 如果需要做样本外预测,要提前清洗测试集:确保所有回归用到的变量无缺失,且year、country的因子水平和训练集完全一致。
- 线性概率模型存在预测值超出0-1区间的问题,仅做危机预警的排序效果评估时可直接使用AUROC,若需要输出准确概率建议改用面板Logit/Probit模型。
内容的提问来源于stack exchange,提问作者Julius Ritter
相关产品推荐
相关产品推荐

