【问题标题】:Aligning Data frame with missing values将数据框与缺失值对齐
【发布时间】:2016-11-10 05:36:52
【问题描述】:

我正在使用具有许多 NA 值的数据框。虽然我能够创建一个线性模型,但由于缺失值和缺少指示列,我随后无法将模型的拟合值与原始数据对齐。

这是一个可重现的例子:

library(MASS)
dat <- Aids2
# Add NA's 
dat[floor(runif(100, min = 1, max = nrow(dat))),3] <- NA
# Create a model
model <- lm(death ~ diag + age, data = dat)
# Different Values
length(fitted.values(model))
# 2745
nrow(dat)
# 2843

【问题讨论】:

    标签: r regression linear-regression na lm


    【解决方案1】:

    如果您不想更改原始数据。试试这个方法,真的很简单。

    names(fitted.values(model)) 是数据的可用观察的行名,我们可以使用此功能添加新列:

    dat[names(fitted.values(model)), "fitted.values"] <- fitted.values(model)
    sum(!is.na(dat[, "fitted.values"]))
    # [1] 2745
    

    【讨论】:

      【解决方案2】:

      我的回答是对@ithomps 解决方案的扩展:

      for(i in 1:nrow(data)){
        data$fitted.values.men[i]<- ifelse(data$sex == 1, 
          fit.males$fitted.values[paste(i)], "NA")
        data$fitted.values.women[i]<- ifelse(data$sex == 0, 
          fit.females$fitted.values[paste(i)], "NA")
        data$fitted.values.combined[i]<- fit.combo$fitted.values[paste(i)]
      }
      

      因为在我的例子中,我运行了三个模型:1 个男性模型、1 个女性模型和 1 个组合模型。为了让事情“更”方便:男性和女性随机分布在我的data 中。此外,我将丢失数据作为lm() 的输入,因此我使用fit &lt;- lm(y~x, data = data, na.action = na.exclude) 来获取模型对象(fit)中的NA。

      希望这对其他人有所帮助。

      (我发现很难提出我的问题/问题,很高兴我找到了这篇文章!)

      【讨论】:

        【解决方案3】:

        我使用了一个简单的 for 循环。拟合值具有它们所属的原始行的属性(名称)。因此:

        for(i in 1:nrow(data)){
          data$fitted.values[i]<-
            fit$fitted.values[paste(i)]
        }
        

        “数据”是您的原始数据框。 Fit 是模型中的对象(即 fit

        【讨论】:

          【解决方案4】:

          这里其实有三种解决方案:

          1. NA 填充到我们自己的拟合值;
          2. 使用predict() 计算拟合值;
          3. 我们自己丢弃不完整的案例,只将完整的案例传递给lm()

          选项 1

          ## row indicator with `NA`
          id <- attr(na.omit(dat), "na.action")
          fitted <- rep(NA, nrow(dat))
          fitted[-id] <- model$fitted
          nrow(dat)
          # 2843
          length(fitted)
          # 2843
          sum(!is.na(fitted))
          # 2745
          

          选项 2

          ## the default NA action for "predict.lm" is "na.pass"
          pred <- predict(model, newdata = dat)  ## has to use "newdata = dat" here!
          nrow(dat)
          # 2843
          length(pred)
          # 2843
          sum(!is.na(pred))
          # 2745
          

          选项 3

          或者,您可以简单地将没有任何NA 的数据框传递给lm()

          complete.dat <- na.omit(dat)
          fit <- lm(death ~ diag + age, data = complete.dat)
          nrow(complete.dat)
          # 2745
          length(fit$fitted)
          # 2745
          sum(!is.na(fit$fitted))
          # 2745
          

          总之,

          • 选项 1 通过填充 NA 以直接的方式进行“对齐”,但我认为人们很少采用这种方法;
          • 选项 2 确实很简单,但计算成本更高;
          • 选项 3 是我最喜欢的,因为它让一切变得简单。

          【讨论】:

          • 嗯,其实最简单的解决办法就是把na.action = na.exclude放到lm里面。
          猜你喜欢
          • 2021-08-13
          • 2012-04-30
          • 1970-01-01
          • 2020-04-13
          • 1970-01-01
          • 1970-01-01
          • 2020-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多