R中的glm如何处理'NA'值


19

我有一个数据表T1,其中包含近一千个变量(V1)和大约2亿个数据点。数据稀疏,大多数条目均为NA。每个数据点都有唯一的ID和日期对,以区别于另一个。

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

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

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

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

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

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

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

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

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

我测试了带有和不带有“ NA”的glm,并找到了不同的答案,这表明在拟合数据时要考虑NA:

范例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 

Answers:


27

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

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

如果不设置na.action,glm()将检查R的全局选项以查看是否在其中设置了默认值。您可以使用getOption("na.action")或来访问您的选项,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或可以访问glm的帮助文件,help(glm)并解释了其中的大部分内容。其他两个有用的资源是:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.