我目前正在尝试根据死亡人数和人口数量来获取我们人口的生命表。我的第一个想法是遵循本文的方法,但经过一些讨论后,我们计划使用不同的模型,例如 GLMM 和 GAM,并探索包含不同的结和族。
作者建议使用训练集和测试集或交叉验证。我一直在阅读(这个网站上有很好的资源和问题!)我想知道我使用的方法是否合适,因为我不完全确定。
这是我的想法:
- 随机播放数据
- 将数据分为训练集(80%)和测试集(20%)。
- 测试训练数据中的不同参数,并使用测试数据进行比较。
- 一旦我有选择的家庭和结,再次洗牌数据。
- 对一个模型进行 5 倍交叉验证(大小数据集 = 3440 个观察值)的 n 次迭代(20 次?)以获得方法的性能(想法是在 4 中选择的模型能够更好地预测数据) .
现在,根据我上传的图,这是我的问题和困惑:
我应该使用嵌套交叉验证并在内部循环中测试模型参数(如图)吗?每个 k 折对应一组参数,或者我需要为每组参数重复嵌套 CV?理论结数可能太低,或者我可能需要为其中一个变量添加一个平滑因子等。我不确定我是否可以在内循环中使用这些参数。
这让我想到了另一个问题。我需要对每种方法进行一次 k 折交叉验证吗?如果我对具有泊松族的 GAM 和具有负二项式的 GAM 使用交叉验证,我可能处于该模型能够更好地预测数据的折叠处,而在另一个折叠处相同的模型可能表现不佳,因此,例如这组结可能不合适。
我不确定的另一件事是一个变量是日历年。改组数据时需要特别小心吗?也许确保每个折叠都有关于所有年份的信息或其他信息?我也想过使用 GLMM 或 GAMM,也许就足够了?
我的另一个问题与输出参数以及如何评估交叉验证有关。由于我的目标是预测,因此我计划查看每个模型的残差 AIC,并绘制预测值和观察值以查看哪种方法表现更好。我应该使用不同的参数吗?
感谢任何帮助或指导,因为我刚开始阅读有关交叉验证的内容并且没有经验。
编辑 - 关注@adrin 和@Gavin Simpson 的回答
如果我理解你的答案,基本上嵌套交叉验证将是这样的:
for each fold in the outer loop
for each parameter in the grid
run each parameter in the inner loop
evaluate each parameter in each k-fold
chose best parameter based on results from inner loop
run best parameter in each k-fold of the outer loop
我想测试的参数是:
- 不同年龄的结(一些固定在边界上,但我想测试一些其他的用于中世纪的结)。
选择节的原因是由于边界处的极端值,因为第一点的死亡率很高(婴儿死亡率)和高于 85 的死亡率(因为高于 85 的数据被分组)。
我刚拿到 Simon Wood 的书,所以我可以了解更多关于 GAM 的信息。我考虑过使用三次样条,但细样条可能会很有趣。看看薄板样条与使用预定义结之间的区别会很有趣。如果薄板样条曲线很好地拟合数据,那将是一个不错的选择。
- 具有泊松和 NB 系列的 GLM 以及具有泊松和 NB 系列的 GAM。
- 我想检查是否包含区域的随机效应。
- 我还想测试性别和年龄、地区和年龄之间的相互作用是否会改善模型。
我没有考虑使用ti
交互,而是沿着这些思路:
gam(deads ~ region*age + gender*age + calendar_year + ti(age,k=7,bs="cr") + offset(log(pop)), knots=list(age=list_knots), family=poisson, data=data, method="REML")
但我也想过尝试这样的事情:
gam(deads ~ s(age,bs="fs",by=region) + s(age,bs="fs",by=gender) + calendar_year + ti(age,k=7,bs="cr") + offset(log(pop)), knots=list(age=list_knots), family=poisson, data=data, method="REML")
显然,我需要阅读更多内容来检查什么是有意义的和更合适的。
- 最后,我想知道是否应该在因子变量中添加一些因子平滑。
现在,也许我应该对最终模型有更清晰的认识。让我听听你的想法。但是让所有这些参数进行测试是/是我对内部循环中交叉验证的困惑的一部分。