如果模型结果中有缺失,则“左连接”glm到原始文件的结果?

时间:2014-06-27 10:55:22

标签: r left-join glm na

用glm

创建模型后
model <- glm(data$y ~ data$x * data$z)

我需要创建一个数据集,其中包含glm的输出和原始数据以供进一步处理

newdata <- data.frame(
                  data$id, 
                  data$y, #observed 
                  fitted(model), #expected
                  resid(model),
                  data$x,
                  data$z,
                  data$othervariable1,
                  data$othervariable2,
                  data$othervariable3
                  )

只要glm产生的数据与数据文件一样多,就可以很好地运行。但是,如果由于任何原因(主要是缺失值)模型数据具有较少的记录,则连接不起作用:

  data.frame(....)中的

错误:参数具有不同的行数:   21,18

为了避免glm中缺少值,

na.action = na.pass似乎无法正常工作

有没有办法将唯一标识符传输到GLM输出?或者是否有一个奇特的功能?(我确定有,但我找不到它)

2 个答案:

答案 0 :(得分:0)

您需要利用na.action属性加载model对象的glm元素。在下面的示例中,为了清楚起见,我调用了glm对象g,以指示modelg的元素:

set.seed(1)
dat <- data.frame(x = rnorm(100),
                  y = rbinom(100,1,.5))
dat$x[sample(1:100, 10, FALSE)] <- NA
g <- glm(y ~ x, data=dat)

# identify dropped observations
d <- attributes(g$model)$na.action

# store results back into original `dat` data.frame
dat$fitted <- NA
dat$fitted[-d] <- g$fitted
dat$resid <- NA
dat$resid[-d] <- g$resid

这正确地将所有内容放回原来的位置:

> summary(dat)
       x                  y            fitted           resid        
 Min.   :-2.21470   Min.   :0.00   Min.   :0.2959   Min.   :-0.3842  
 1st Qu.:-0.56213   1st Qu.:0.00   1st Qu.:0.3317   1st Qu.:-0.3472  
 Median : 0.11391   Median :0.00   Median :0.3439   Median :-0.3317  
 Mean   : 0.08907   Mean   :0.38   Mean   :0.3444   Mean   : 0.0000  
 3rd Qu.: 0.69516   3rd Qu.:1.00   3rd Qu.:0.3581   3rd Qu.: 0.6412  
 Max.   : 2.40162   Max.   :1.00   Max.   :0.3928   Max.   : 0.7041  
 NA's   :10                        NA's   :10       NA's   :10

答案 1 :(得分:0)

这是na.exclude的情况。请参阅?residuals.glm的详细信息部分。基本上,如果使用na.exclude,残差和拟合值将包含NA值。

使用来自@Thomas的数据回答:

fit1 = glm(y ~ x, data = dat)
length(residuals(fit1))
[1] 90

fit2 = glm(y ~ x, data = dat, na.action = na.exclude)
length(residuals(fit2))
[1] 100