在 R 中,如何估算低于检测限的左删失数据?
In R, how do you impute left-censored data that is below a limit of detection?
这可能是个简单的问题,但我无法解决。我有一个生化测试结果的数据框。由于检测限制,其中一些测试如 base_crp
返回值如 <3
。在继续之前,我需要估算这些数据。我想正确地做到这一点,所以不仅仅是替代。
我尝试了 zCompositions 包中的 multLN,但它似乎认为所有 <3
值都是负数(错误说 X contains negative values
)。那里似乎也没有太多文档-这是一个不起眼的包吗?
我也查看了 LODI 但它希望我为插补模型指定协变量 - 是否有适当的方法来 select 这些?无论如何,我选择了 3 个理论上相关性很好的代码并使用了这个代码:
clmi.out <- clmi(formula = log(base_crp) ~ base_wcc + base_neut + base_lymph, df = all, lod = crplim, seed = 12345, n.imps = 5)
其中 base_crp 是我要修复的变量。我用 NA
替换了所有 <3 并插入了一个新列 all$crplim <- "3"
。然而,这只是回归
Error in sprintf("%s must be numeric.") : too few arguments
.
即使我能让 LODI 工作,我也不确定它是否是正确的工具。我只是一个几乎没有统计背景的本科生,所以我真的不明白我在做什么——我只想要一些可以用数字填充列的东西,这样我就可以继续进行 Pearson 相关和线性回归等。我真的很感激这方面的帮助。提前致谢。
我之前对 CRP(C 反应蛋白)水平进行了一些统计建模 - 请参阅 this peer-reviewed paper 作为示例。 CRP 具有大约 log-normal 的分布,所有测试适应症的未选择人群的中值通常约为 3.5 mg/l(大多数健康人将属于“<3mg/l”类别).您可能不想使用插补模型,因为这些模型适用于 missing 数据。低 CRP 数据 而不是 缺失。您已经知道它位于某个范围内,因此如果您以这种方式进行插补,就会丢失信息。
将“<3”替换为回归等的数值是合理的,只要您使用它来将 CRP 与临床发现等相关联,而不是(如 Ben Norris 指出的那样)用于 CRP 机器校准。
我可以从我在上面链接的研究中 high-sensitvity CRP 测量的 10,000 多个样本的数据中告诉你,CRP < 3 的人的平均 CRP 约为 1.3,替代是合理的大多数 real-world 临床观察研究的所有“CRP < 3”测量值为 1.3。
如果您真的需要缺失的 CRP 的合理数值,您可以估算对数正态分布的下半部分。以下函数将为您提供可能与 real-life CRP 测量值无法区分的数字:
impute_crp <- function(n)
{
x <- exp(rnorm(10 * n, 1.355, 1.45))
round(x[x < 3][seq(n)], 1)
}
所以你可以
impute_crp(10)
#> [1] 1.5 2.0 1.1 0.4 2.5 0.1 0.7 1.5 1.4 0.4
和
base_crp[base_crp == "<3"] <- impute_crp(length(which(base_crp == "<3"))
但是,您会注意到我在自己的 CRP 模型中根本没有使用插补。将较低的值替换为检测阈值对于建模目的来说已经足够好了——而且我相当确定您是将“< 3”替换为对数正态尾部,还是全部替换为 1.3,或者全部替换为 2,都没有区别到你试图得出的结论。
这可能是个简单的问题,但我无法解决。我有一个生化测试结果的数据框。由于检测限制,其中一些测试如 base_crp
返回值如 <3
。在继续之前,我需要估算这些数据。我想正确地做到这一点,所以不仅仅是替代。
我尝试了 zCompositions 包中的 multLN,但它似乎认为所有 <3
值都是负数(错误说 X contains negative values
)。那里似乎也没有太多文档-这是一个不起眼的包吗?
我也查看了 LODI 但它希望我为插补模型指定协变量 - 是否有适当的方法来 select 这些?无论如何,我选择了 3 个理论上相关性很好的代码并使用了这个代码:
clmi.out <- clmi(formula = log(base_crp) ~ base_wcc + base_neut + base_lymph, df = all, lod = crplim, seed = 12345, n.imps = 5)
其中 base_crp 是我要修复的变量。我用 NA
替换了所有 <3 并插入了一个新列 all$crplim <- "3"
。然而,这只是回归
Error in sprintf("%s must be numeric.") : too few arguments
.
即使我能让 LODI 工作,我也不确定它是否是正确的工具。我只是一个几乎没有统计背景的本科生,所以我真的不明白我在做什么——我只想要一些可以用数字填充列的东西,这样我就可以继续进行 Pearson 相关和线性回归等。我真的很感激这方面的帮助。提前致谢。
我之前对 CRP(C 反应蛋白)水平进行了一些统计建模 - 请参阅 this peer-reviewed paper 作为示例。 CRP 具有大约 log-normal 的分布,所有测试适应症的未选择人群的中值通常约为 3.5 mg/l(大多数健康人将属于“<3mg/l”类别).您可能不想使用插补模型,因为这些模型适用于 missing 数据。低 CRP 数据 而不是 缺失。您已经知道它位于某个范围内,因此如果您以这种方式进行插补,就会丢失信息。
将“<3”替换为回归等的数值是合理的,只要您使用它来将 CRP 与临床发现等相关联,而不是(如 Ben Norris 指出的那样)用于 CRP 机器校准。
我可以从我在上面链接的研究中 high-sensitvity CRP 测量的 10,000 多个样本的数据中告诉你,CRP < 3 的人的平均 CRP 约为 1.3,替代是合理的大多数 real-world 临床观察研究的所有“CRP < 3”测量值为 1.3。
如果您真的需要缺失的 CRP 的合理数值,您可以估算对数正态分布的下半部分。以下函数将为您提供可能与 real-life CRP 测量值无法区分的数字:
impute_crp <- function(n)
{
x <- exp(rnorm(10 * n, 1.355, 1.45))
round(x[x < 3][seq(n)], 1)
}
所以你可以
impute_crp(10)
#> [1] 1.5 2.0 1.1 0.4 2.5 0.1 0.7 1.5 1.4 0.4
和
base_crp[base_crp == "<3"] <- impute_crp(length(which(base_crp == "<3"))
但是,您会注意到我在自己的 CRP 模型中根本没有使用插补。将较低的值替换为检测阈值对于建模目的来说已经足够好了——而且我相当确定您是将“< 3”替换为对数正态尾部,还是全部替换为 1.3,或者全部替换为 2,都没有区别到你试图得出的结论。