如何在 R 中的 glm 中处理“NA”值

机器算法验证 r 广义线性模型 缺失数据
2022-01-29 16:38:02

我有一个数据表 T1,其中包含近一千个变量(V1)和大约 2 亿个数据点。数据稀疏,大多数条目是 NA。每个数据点都有一个唯一的 id 和日期对来区分。

我有另一个表 T2,其中包含一组单独的变量 (V2)。此表还具有唯一标识 T2 中的条目的 id 和日期对。

我们怀疑 T1 中的数据可以用来预测 T2 中变量的值。

为了证明这一点,我想在 R 中应用“glm”模型并检查我们是否真的可以在 T2 中找到一些依赖于 T1 中的变量的变量。

对于 T2 中的每个变量,我开始提取 T1 中具有相同 id 和日期对的所有数据,这导致某些测试变量的数据点要小得多,约为 50K。

我现在应用glm面临的问题如下。

  1. 在某些情况下,它向我显示错误“未找到拟合”和警告“glm.fit:算法未收敛”。我不确定为什么会显示?

  2. 在 glm 中如何处理 NA?它会先删除所有涉及“NA”的记录,然后再进行拟合吗?

  3. 首先删除所有NA然后调用'glm'是一个好策略吗?我担心这可能会显着减少数据点,因为它们中的大多数都是 NA。

  4. 使用哪种方法计算系数。我找不到任何讨论如何计算输出的网站、论文或书籍。

我在有和没有'NAs'的情况下测试了glm,发现了不同的答案,在拟合数据时考虑了NAs:

示例 1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

示例 2:

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 
1个回答

NA 处理:您可以控制 glm 如何处理丢失的数据。glm() 有一个参数na.action,它指示 glm 应该使用以下哪些通用函数来处理数据中的 NA:

  • na.omitna.exclude: 如果观测值包含任何缺失值,则删除它们;如果使用 na.exclude ,则某些函数将通过为省略的情况插入 NA 来将残差和预测填充到正确的长度。
  • na.pass:保留所有数据,包括 NA
  • na.fail:仅当对象不包含缺失值时才返回

如果您没有设置 na.action,glm() 将检查 R 的全局选项以查看是否在此处设置了默认值。getOption("na.action")您可以使用or访问您的选项,options("na.action")并且可以使用例如,options(na.action = "na.omit") 但是,从您在示例 1 中提供的 R 输出来看,您似乎正在设置na.action = na.omit. 所以,是的,至少在那种情况下,您在拟合之前删除了所有带有 NA 的案例/行。此外,我很确定na.action = na.pass当数据有 NA 时会导致 glm() 失败(试试看)。

错误: glm() 正在使用迭代过程(迭代加权最小二乘;IWLS)进行最大似然估计。您有时会出错,因为它只会经过预定义的迭代次数,如果它没有很好的拟合,它就会放弃。这个数字由参数 maxit 控制,默认情况下是maxit = 25. 您可以尝试将其设置得更高,当然,这会花费更长的时间。(如果你设置trace=TRUE它会显示每次迭代的结果。)

其他信息来源: glm 的帮助文件可以通过?glmhelp(glm)解释大部分内容。另外两个有用的资源是: