首页 > 解决方案 > 使用小鼠池功能时,对因子 x 调用 var(x) 已失效

问题描述

我正在使用老鼠并试图汇集多个插补。

#kp is a dataframe with three columns, "x", "Y", and "View". x and Y are numeric, View is class "character"
html <-  read_html("https://wiki.socr.umich.edu/index.php/SOCR_Data_KneePainData_041409")
kp <- html_nodes(html, "table")[[2]] %>%
  html_table()
kp$View <- factor(kp$View)
kp_m <- as.data.frame(kp)
#Some code edited out - I replace values in kp_m with NA because this is for a homework assignment testing multiple imputations. Result is kp_m, a version of kp with 5% of values missing.
kp_i <- mice(kp_m, m=5, maxit=50, meth='pmm', seed=1)
kp_p <- pool(kp_i)

在上面对“pool”的调用中,我收到错误:

对因子 x 调用 var(x) 已失效。使用类似 'all(duplicated(x)[-1L])' 的东西来测试一个常数向量。调用:... tibble -> tibble_quos -> eval_tidy -> vapply -> FUN -> var

我见过其他人有这个错误消息,但从来没有在这个pool函数的上下文中。有谁知道如何解决这个问题,或者是什么原因?

标签: rdataframer-mice

解决方案


你必须pool()在一个模型上。该错误信息目前不是很有用,您应该向作者提出。

例子:

library(mice)
d <- data.frame(matrix(sample(5, 1e3, replace=T), 100, 10))
d$X2 <- as.factor(d$X2)
d$X2[2] <- NA

kp_i <- mice(d, m=5, maxit=50, meth='pmm', seed=1, printFlag=F)
fit <- pool(with(data = kp_i, exp = lm(X1 ~ X2)))
fit
# Class: mipo    m = 5 
#          term m   estimate       ubar            b          t dfcom       df          riv       lambda        fmi
# 1 (Intercept) 5  3.1666667 0.09186523 2.958228e-31 0.09186523    95 93.05190 3.864219e-30 3.864219e-30 0.02082208
# 2         X22 5  0.5192982 0.18178789 2.464861e-03 0.18474572    95 91.03707 1.627079e-02 1.601029e-02 0.03693799
# 3         X23 5 -0.2986667 0.16021780 2.450000e-04 0.16051180    95 92.88353 1.835002e-03 1.831641e-03 0.02265207
# 4         X24 5  0.2905641 0.15699066 9.720710e-04 0.15815715    95 92.25895 7.430284e-03 7.375482e-03 0.02821603
# 5         X25 5 -0.1666667 0.20997768 4.641491e-32 0.20997768    95 93.05190 2.652563e-31 2.652563e-31 0.02082208

在哪里

class(fit)
# [1] "mipo"       "data.frame"

你试图改为pool一个"mids"对象:

class(kp_i)
# [1] "mids"

broom::tidy并在函数代码中遇到与使用相关的可能错误:

pool(kp_i)
# Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) : 
#   Calling var(x) on a factor x is defunct.
# Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.
# In addition: Warning messages:
# 1: Data frame tidiers are deprecated and will be removed in an upcoming release of broom. 
# 2: In get.dfcom(object, dfcom) : Infinite sample size assumed.
# 3: Data frame tidiers are deprecated and will be removed in an upcoming release of broom. 
# 4: In mean.default(X[[i]], ...) :
#   argument is not numeric or logical: returning NA

lapply(kp_i, broom::tidy)
# Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) : 
#   Calling var(x) on a factor x is defunct.
# Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.
# In addition: Warning messages:
# 1: Data frame tidiers are deprecated and will be removed in an upcoming release of broom. 
# 2: In mean.default(X[[i]], ...) :
#   argument is not numeric or logical: returning NA

它隐藏在mice:::summary.mira第 6 行:

function (object, type = c("tidy", "glance", "summary"), ...) 
{
  type <- match.arg(type)
  fitlist <- getfit(object)
  if (type == "tidy") {
    v <- lapply(fitlist, tidy, effects = "fixed", parametric = TRUE, 
                ...) %>% bind_rows()
  }
  if (type == "glance") {
    v <- lapply(fitlist, glance, ...) %>% bind_rows()
  }
  if (!"nobs" %in% colnames(v)) {
    v$nobs <- tryCatch(length(stats::residuals(getfit(object)[[1]])), 
                       error = function(e) NULL)
  }
  if (type == "summary") {
    v <- lapply(fitlist, summary, ...)
  }
  v
}
<bytecode: 0x557104d8eb28>
<environment: namespace:mice>

您可能正在寻找complete()

complete(kp_i, action='long')
#    .imp .id X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1     1   1  3  1  4  1  2  4  4  4  5   2
# 2     1   2  2  2  2  1  1  4  4  5  4   5
# 3     1   3  3  3  5  4  5  2  2  1  5   2
# 4     1   4  4  2  1  1  3  5  3  1  5   3
# 5     1   5  3  3  1  1  3  5  3  4  4   5
# 6     1   6  1  4  2  1  5  4  4  1  4   3
# 7     1   7  2  3  4  5  2  1  3  2  1   4
# 8     1   8  2  3  3  5  2  4  4  5  1   3
# 9     1   9  4  5  5  4  1  5  4  5  4   2
# 10    1  10  3  3  4  4  2  5  1  2  1   3
# 11    1  11  3  5  4  2  3  1  5  1  5   1
# 12    1  12  4  2  3  3  3  2  1  1  3   5
# 13    1  13  1  1  3  4  2  2  2  2  2   4
# 14    1  14  4  5  2  2  1  2  4  4  1   5
# 15    1  15  3  5  3  2  4  4  3  2  5   3
# 16 ...

注意:请务必在这种情况下查看我的相关答案


推荐阅读