【问题标题】:"Number of observations <= number of random effects" error“观察次数 <= 随机效应数”错误
【发布时间】:2019-04-16 20:23:35
【问题描述】:

我正在使用一个名为 diagmeta 的包进行元分析。我可以将此包与名为Schneider2017 的内置数据集一起使用。但是,当我创建自己的数据库/数据集时,出现以下错误:

错误:观察数 (=300)

SO 上的另一个线程表明该错误是由一个或多个列的数据格式引起的。我已确保每一列的数据类型与 Schneider2017 数据集中的数据类型相匹配 - 无效。

Link to the other thread

我尝试将 Schneider2017 数据集中的所有数据提取到 excel 中,然后通过 R studio 从 Excel 导入数据集。这又没有什么区别。这向我表明,数据格式中的某些内容可能会有所不同,尽管我不知道如何。

diag2 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint,
                   studlab = paste(author,year,group),
                   data = SRschneider,
                   model = "DIDS", log.cutoff = FALSE,
                   check.nobs.vs.nRE = "ignore")

数据集如下所示:

我预计与内置数据集相同的成功执行和绘图,但不断收到此错误。

执行 str(mydataset) 的结果:

> str(SRschneider)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   150 obs. of  10 variables:
 $ ...1    : num  1 2 3 4 5 6 7 8 9 10 ...
 $ study_id: num  1 1 1 1 1 1 1 1 1 1 ...
 $ author  : chr  "Arora" "Arora" "Arora" "Arora" ...
 $ year    : num  2006 2006 2006 2006 2006 ...
 $ group   : chr  NA NA NA NA ...
 $ cutpoint: chr  "6" "7.0" "8.0" "9.0" ...
 $ tpos    : num  133 131 130 127 119 115 113 110 102 98 ...
 $ fneg    : num  5 7 8 11 19 23 25 28 36 40 ...
 $ fpos    : num  34 33 31 30 28 26 25 21 19 19 ...
 $ tneg    : num  0 1 3 4 6 8 9 13 15 15 ...

【问题讨论】:

  • A) 您能否提供一个示例,说明您尝试放入 diagemtadput 的数据。至少快照会有所帮助。 B) 您能否提供str(data) 的输出,其中data 是您尝试输入的新数据集?
  • 您的意思是与数据集的图像不同吗?这就是我正在努力的方向。我现在已经添加了 str(my dataset) 的输出。

标签: r mixed-models


【解决方案1】:

快速跟进 Ben 的详细回答。

diagmeta() 中实现的统计方法期望参数 cutpoint 是一个连续变量。我们添加了对参数 cutpoint 的相应检查(以及参数 TPFPTNFN) 在 R 包 diagmeta 版本 0.3-1 中;技术细节见commit in GitHub repository

因此,以下 R 命令将导致信息更丰富的错误消息:

data(Schneider2017)
diagmeta(tpos, fpos, tneg, fneg, as.character(cutpoint),
         studlab = paste(author, year, group), data = Schneider2017)

【讨论】:

    【解决方案2】:

    你说你

    已确保每一列的数据类型与 Schneider2017 数据集中的数据类型匹配

    但这似乎不是真的。除了num(数字)和int(整数)类型之间的差异(实际上通常并不重要)之外,您的数据还有

     $ cutpoint: chr  "6" "7.0" "8.0" "9.0" ...
    

    str(Schneider2017)

     $ cutpoint: num  6 7 8 9 10 11 12 13 14 15 ...
    

    让你的切点是一个字符而不是数字意味着 R 将尝试将其视为一个分类变量(具有许多离散级别)。这很可能是您的问题的根源。

    cutpoint 变量可能是一个字符,因为 R 在此列中遇到了一些无法解释为数字的值(就像印刷错误一样简单)。您可以使用SRschneider$cutpoint &lt;- as.numeric(SRschneider$cutpoint)通过蛮力将变量转换为数字(无法解释的值将设置为NA),但最好去上游看看问题出在哪里。

    如果您使用 tidyverse 包来加载数据,您应该会得到一个可能有用的“解析问题”列表。也可以尝试cp &lt;- SRschneider$cutpoint; cp[which(is.na(as.numeric(cp)))]查看无法转换的值。

    【讨论】:

    • 我遵循你的推理。我会按照您的建议进行处理,但我怀疑它不会解决问题,原因如下:这个数据集是从 excel 导入的,我没有修复数据格式。在此之前,我有一个我自己的数据集的 1.0 版本——一个直接在 R Studio 中制作的数据框——这就是我修复数据格式的地方。因此,既然它没有帮助,我怀疑错误来自其他问题。
    • 好的。在“cutpoint”列中没有看到明显的拼写错误(这是有道理的,因为它是为工作的 Schneider2017 数据集复制的),我继续并修复了该列的格式。这使它立即成功执行。这对我的项目非常好,但也很好奇。我最好的猜测是,较早修复数据格式(在我的第一个数据集中)的原因是当时数据集太小 - 所以我的数据集有两个问题,都导致相同的错误。
    • “组”格式的差异也是我怀疑并在我的第一个数据集中修复的一个因素。但事实证明,它现在在我的第二个数据集中工作,格式差异不会导致错误。
    猜你喜欢
    • 2021-12-13
    • 2013-07-06
    • 2011-05-27
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多