我有一些CRP(C-React蛋白)的左删失数据,我想知道如何插补低于检测限的值,以使插补值在预期范围内(此处:0<估算值<0.2)。
我正试图用'imputeLCMD'包来实现这一点,但由于'imputeLCMD'及其所有依赖项的安装有点复杂,我也愿意听听其他方法。
请考虑以下MWE:
# Load libraries
library(dplyr)
library(imputeLCMD)
# Assign the dputted random data to a data frame
df <- structure(list(participant_id = 1:10, CRP = c("2.9", "<0.2",
"<0.2", "8.8", "9.4", "0.5", "5.3", "8.9", "5.5", "<0.2"), LDL_cholesterol = c(195.7,
145.3, 167.8, 157.3, 110.3, 190, 124.6, 104.2, 132.8, 195.5),
fasting_glucose = c(114.5, 104.6, 102, 119.7, 102.8, 105.4,
97.2, 99.7, 84.5, 77.4), creatinine = c(1.5, 1.4, 1.2, 1.3,
0.5, 1, 1.3, 0.7, 0.8, 0.7)), row.names = c(NA, -10L), class = c("tbl_df",
"tbl", "data.frame"))
上面的模拟 Dataframe 和下面的模拟 Dataframe 与我的真实的数据相似。
# View the random data
head(df, n=5)
#> # A tibble: 5 × 5
#> participant_id CRP LDL_cholesterol fasting_glucose creatinine
#> <int> <chr> <dbl> <dbl> <dbl>
#> 1 1 2.9 196. 114. 1.5
#> 2 2 <0.2 145. 105. 1.4
#> 3 3 <0.2 168. 102 1.2
#> 4 4 8.8 157. 120. 1.3
#> 5 5 9.4 110. 103. 0.5
然而,我有点迷失在如何继续从这里开始。为了使用软件包imputeLCMD对这些左删失数据的缺失值进行插补,我假设必须首先将左删失值转换为NA:
df <- df %>%
mutate(CRP = na_if(CRP, "<0.2")) %>%
mutate(CRP = as.numeric(CRP))
head(df, n=5)
#> # A tibble: 5 × 5
#> participant_id CRP LDL_cholesterol fasting_glucose creatinine
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2.9 196. 114. 1.5
#> 2 2 NA 145. 105. 1.4
#> 3 3 NA 168. 102 1.2
#> 4 4 8.8 157. 120. 1.3
#> 5 5 9.4 110. 103. 0.5
如果我现在运行imputeLCMD包中的一个wrappers,我会得到一些结果:
# Impute the missing data
df_imputed <- impute.wrapper.SVD(df, K = 4) %>% as.data.frame()
# Round the result
df_imputed <- df_imputed %>% mutate_at(vars(CRP), ~round(., digits = 1))
# Place the original CRP next to the imputed one for comparison
df_imputed <- df_imputed %>% mutate(original_CRP = df$CRP)
df_imputed <- df_imputed %>% select(1,2,6,3,4,5)
# Display the result
head(df_imputed, n=5)
#> participant_id CRP original_CRP LDL_cholesterol fasting_glucose creatinine
#> 1 1 2.9 2.9 195.7 114.5 1.5
#> 2 2 5.8 NA 145.3 104.6 1.4
#> 3 3 5.9 NA 167.8 102.0 1.2
#> 4 4 8.8 8.8 157.3 119.7 1.3
#> 5 5 9.4 9.4 110.3 102.8 0.5
创建于2023-05-27带有reprex v2.0.2
我的问题:
1.我不知道如何为imputeLCMD包设置参数,以便估算值应该是:>0且<0.2。
1.如何确保imputeLCMD不会将participant_id本身作为数值数据输入到插补计算中?
我已经在SO中看到了一些great alternative approaches for left-censored data,但如果能知道我在'imputeLCMD'中做错了什么(或做对了什么),那就太好了。
1条答案
按热度按时间uxhixvfz1#
您可以使用最大似然估计来估计数据的分布,同时使用某些观测值低于定量下限(LLOQ)的信息。为了得到合理的插补值,然后从估计分布的< LLOQ区域进行采样。
让我们用一些模拟的对数正态分布数据来演示:
对于估计步骤,我们需要定义目标函数;具有左删失值的对数正态分布的对数似然:
然后,我们最大化对数似然,给定观测数据:
我们已经可以看到我们恢复了底层参数:
最后,从拟合分布的< LLOQ区域采样并创建完整的数据集:
我们已经成功恢复了底层的发行版:
我现在已经将其打包到一个实验性的censlm包中:
MLE模型拟合使用
survival::survreg()
完成: