【问题标题】:Error in dataframe *tmp* replacement has x data has y数据帧中的错误 *tmp* 替换有 x 数据有 y
【发布时间】:2018-04-24 06:28:41
【问题描述】:

我是 R 的初学者。这是一个非常简单的代码,我试图在其中保存残差项:

# Create variables for child's EA:

dat$cldeacdi <- rowMeans(dat[,c('cdcresp', 'cdcinv')],na.rm=T)
dat$cldeacu <- rowMeans(dat[,c('cucresp', 'cucinv')],na.rm=T)

# Create a residual score for child EA:

dat$cldearesid <- resid(lm(cldeacu ~ cldeacdi, data = dat))

我收到以下消息:

Error in `$<-.data.frame`(`*tmp*`, cldearesid, value = c(-0.18608488908881,  : 
  replacement has 366 rows, data has 367

我搜索了此错误,但找不到任何可以解决此问题的方法。此外,我为妈妈的 EA 创建了完全相同的代码,它很好地保存了残差,没有错误。如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: r regression lm


    【解决方案1】:

    我感觉你的数据中有NAs。看这个例子:

    #mtcars data set
    test <- mtcars
    #adding just one NA in the cyl column
    test[2, 2] <- NA
    
    #running linear model and adding the residuals to the data.frame
    test$residuals <- resid(lm(mpg ~ cyl, test))
    Error in `$<-.data.frame`(`*tmp*`, "residuals", value = c(0.382245430809409,  : 
      replacement has 31 rows, data has 32
    

    如您所见,这会导致与您类似的错误。

    作为验证:

    length(resid(lm(mpg ~ cyl, test)))
    #31
    nrow(test)
    #32
    

    发生这种情况是因为lm 将在运行回归之前对数据集运行na.omit,因此如果您有任何带有 NA 的行,这些行将被消除,从而导致更少的结果。

    如果您在您的dat 数据集上运行na.omit(即在代码的最开头使用dat &lt;- na.omit(dat),那么您的代码应该可以工作。

    【讨论】:

    • 实际上,我只是注意到,当我运行 na.omit 时,它会清除我的数据集,例如 - 对我的变量进行 0 次观察...这是为什么呢?
    • na.omit 将从 data.frame 中删除完整的行,如果该行中至少有一列带有NAlm 也这样做,因为它在内部调用 na.omit。确保在运行 na.omit 之前排除了回归中不需要的列。
    【解决方案2】:

    这是一个旧线程,但也许这可以帮助其他面临同样问题的人。就 LyzanderR 而言,检查 NA 作为第一道防线。此外,请确保您在x 中没有任何因素,因为这也可能导致错误。

    【讨论】:

    • 嗨道森,如果我在 x 中有 18 个因子,是不是太多了?如果太多了怎么办?而且我认为教程和我一样。
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2018-02-28
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多