微合成函数出现错误 "if (dum <= dum1 + 1) { : missing value where TRUE/FALSE needed"。

5

有人能帮我弄清楚为什么我在使用 microsynth 函数时会出现错误代码吗?

我认为我已经按照教程的描述准确地设置了数据,包括一个ID变量、一个时间变量(数值型)和一个二元治疗变量。

当我运行以下代码时:

cov.var <- c("age", "sex", "ethgr2", "hh_size", "country_4", 
             "inc_imp", "nssec4", "ten1", "num_adult")
match.out <- c("ov_1", "ov_2", "ov_3", "ov_4")

synth1 <- microsynth(DS, 
                   idvar="seriali", timevar="year_2", intvar="treated", 
                   start.pre=1, end.pre=6, end.post=9, 
                   match.out=match.out, match.covar=cov.var, 
                   result.var=match.out, omnibus.var=match.out,
                   test="lower",
                   n.cores = min(parallel::detectCores(), 2))

我遇到了这个错误:
Error in if (dum <= dum1 + 1) { : missing value where TRUE/FALSE needed

R没有提供错误发生位置的回溯信息。此外,在查看函数源代码时,我无法看到我可以提供TRUE/FALSE的位置。

我尝试按照 microsynth 教程来查看是否能够重现错误。然而,我得到了不同的错误。

data(seattledmi)
set.seed(99199)
cov.var <- c("TotalPop", "BLACK", "HISPANIC", "Males_1521", "HOUSEHOLDS", 
             "FAMILYHOUS", "FEMALE_HOU", "RENTER_HOU", "VACANT_HOU")
match.out <- c("i_felony", "i_misdemea", "i_drugs", "any_crime")
sea1 <- microsynth(seattledmi, 
                   idvar="ID", timevar="time", intvar="Intervention", 
                   start.pre=1, end.pre=12, end.post=16, 
                   match.out=match.out, match.covar=cov.var, 
                   result.var=match.out, omnibus.var=match.out,
                   test="lower",
                   n.cores = min(parallel::detectCores(), 2))
sea1

Error in colnames(newdat) : object 'newdat' not found

任何建议都将不胜感激!


当我尝试这个例子时,我遇到了和你一样的错误。你应该在GitHub上告诉开发者这个问题,也许这会修复你的错误,但也有可能这个包仍然是实验性的。如果你真的想要解决这个问题,你应该尝试使用debug()debugonce()。这可能会更有帮助给开发者。 - Dan Chaltiel
啊,有趣。我会做的。谢谢你的帮助! - jparnham
当我尝试使用我的数据集时,我遇到了同样的问题。我收到了这个错误信息,但不知道它的含义。即使将我的数据转换为“data.frame”,问题仍然存在。 - cach dies
2个回答

2
调试代码后,发现 microsynth 处理 tibble 对象时存在一些问题;至少第二个错误明确来自此处:函数 newreshape 尝试运行 time.tmp <- data[,timevar],但当应用于 tibble 时,它不会提取矢量(这将导致进一步的问题)-- 应该是例如 time.tmp <- dplyr::pull(data, timevar)

即使修复了这个问题,仍然存在更多错误,因此我建议在运行代码之前将数据转换为 data.frame,这对我有效:

sea1 <- microsynth(as.data.frame(seattledmi), 
               idvar="ID", timevar="time", intvar="Intervention", 
               start.pre=1, end.pre=12, end.post=16, 
               match.out=match.out, match.covar=cov.var, 
               result.var=match.out, omnibus.var=match.out,
               test="lower",
               n.cores = min(parallel::detectCores(), 2))

这有帮助吗?


1
虽然这对于这个特定的情况可以工作,但问题不仅在于数据的类别,当我使用自己的数据时,尽管它是一个 data.frame,但仍然出现相同的错误。 - cach dies

1

当您的数据中存在缺失观测时,就会出现此错误。以下是使用seattledmi数据集产生错误的最小代码示例:

library(microsynth)

# Delete the fifth row of the seattledmi data set
mySeattledmi <- seattledmi[-c(5),]

# Define variables as in the microsynth tutorial
cov.var <- c("TotalPop", "BLACK", "HISPANIC", "Males_1521", "HOUSEHOLDS", 
             "FAMILYHOUS", "FEMALE_HOU", "RENTER_HOU", "VACANT_HOU")
match.out <- c("i_felony", "i_misdemea", "i_drugs", "any_crime")

# Run microsynth using the mySeattledmi data and all other parameters set equal to
# ... the values used in Example 1 of the microsynth tutorial
sea5 <- microsynth(mySeattledmi, 
                   idvar="ID", timevar="time", intvar="Intervention", 
                   start.pre=1, end.pre=12, end.post=16, 
                   match.out=match.out, match.covar=cov.var, 
                   result.var=match.out, omnibus.var=match.out,
                   test="lower",
                   n.cores = min(parallel::detectCores(), 2))

发生的情况是,microsynth的newreshape函数创建了一个矩阵,其中包含数据中intvar列的值。该矩阵的尺寸为n乘以t,其中n等于id的数量,t等于数据中的时间段数,例如,在seattledmi数据中,n = 9642,t = 16。如果有任何缺失观测值,则该矩阵将包含NA。这导致if (dum <= dum1 + 1)中的dum的值评估为NA,从而导致错误消息。
解决问题的一种方法是消除包含缺失值的任何处理或对照组。继续上一个示例,以下代码删除与具有少于16个(即end.post - start.pre + 1)观测值的ID相关联的mySeattledmi数据中的任何观测值。
library(dplyr)

nobsById <- mySeattledmi %>% group_by(ID) %>% summarize(nobs = n())
mySeattledmi2 <- mySeattledmi %>% subset(!(ID %in% nobsById[nobsById$nobs < 16, 1][[1]]))

# Call microsynth again this time with mySeattledmi2
sea6 <- microsynth(mySeattledmi2, 
                   idvar="ID", timevar="time", intvar="Intervention", 
                   start.pre=1, end.pre=12, end.post=16, 
                   match.out=match.out, match.covar=cov.var, 
                   result.var=match.out, omnibus.var=match.out,
                   test="lower",
                   n.cores = min(parallel::detectCores(), 2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接