如何估算R语言中glm函数的运行耗时?
运行时长估算方法及优化建议
- 抽样预跑测试
从全量40000条观测中按10%、20%、50%的比例随机抽取分层子样本(抽样时注意保留1800水平因子的全部类别,避免子样本丢失因子水平),分别用glm()运行完全相同的logit模型,记录每个子样本的运行时长。glm的运行时长和样本量基本呈线性正相关,你可以用三个梯度样本的耗时拟合线性趋势,外推得到全样本的预估总时长。比如10%样本耗时1.5分钟、20%耗时2.9分钟、50%耗时7.2分钟的情况下,全样本预估时长在14-15分钟区间,可以和你已跑10分钟未终止的情况交叉验证。 - 迭代过程监控
给glm()添加上trace = TRUE的控制参数,代码示例如下:glm(因变量 ~ 自变量 + 高维因子变量, data = 数据集, family = binomial(link = "logit"), control = list(trace = TRUE, maxit = 25))
运行时控制台会输出每一轮迭代的偏差值和单轮耗时,你可以记录前3-5轮的平均单轮耗时,乘以logit模型常规所需的5-15轮收敛迭代数,就能快速估算总耗时。如果前3轮平均每轮要2.2分钟,总耗时大概率在11-33分钟区间。
额外优化提示
你当前运行慢的核心原因是1800水平的因子会被glm()默认生成1799个虚拟变量,大幅拉高模型计算量。如果这个因子是固定效应变量,建议直接更换为fixest包的feglm()函数,该工具专门针对高维固定效应优化,跑你这个量级的logit模型通常几十秒即可得到结果,无需长时间等待。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

