使用NADA2包cencorreg函数单因子分析报错求助
问题:NADA2包
cencorreg单因子分析报错,多因子组合分析正常 我使用R 4.2.2(x86_64-w64-mingw32/x64),借助NADA2包的cencorreg函数分析左截尾变量met(鱼类金属浓度)与age、gend、area等因子的关系,cens列标记met是否低于检测限(TRUE表示低于)。多因子组合分析可正常运行,但仅传入单个因子(如age、gend)时,触发如下错误:
Error in log(nonas[, 1]) : non-numeric argument to mathematical function
可复现代码
# 数据集 dfr <- structure(list(cens = c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), met = c(0.770, 1.147, 0.278,0.172, 0.136, 0.567,0.2614, 0.1749, 0.151, 1.7154, 0.158, 1.532, 3.758, 2.634, 0.606,8.216, 0.184, 17.517, 2.046, 0.151, 0.2326, 2.7239, 0.948,2.947, 0.147, 0.265, 0.304, 0.147, 0.146, 0.134, 0.22, 0.816, 0.140, 0.158, 0.154, 3.854, 0.157, 0.129, 0.355,2.125, 0.332, 0.165, 0.159, 0.148, 0.125, 0.114, 0.144, 0.2574, 0.170,0.11, 0.805, 0.324, 2.852, 0.841, 0.265, 0.237,0.349, 1.921, 0.394, 0.299, 3.829, 0.122, 0.105, 0.482, 0.141,0.365, 0.108, 0.639, 0.327, 0.296, 0.197, 0.316, 0.116), age = c("yo", "ad", "subad", "ad", "yo", "ad", "subad", "yo", "yo", "subad", "yo", "yo", "yo", "subad", "yo", "subad", "yo", "yo", "yo", "ad", "ad", "subad", "ad", "subad", "yo", "subad", "subad", "yo", "yo", "yo", "yo", "yo", "yo", "yo", "yo", "yo", "subad", "yo", "ad", "subad", "ad", "yo", "yo", "yo", "yo", "ad", "ad", "yo", "yo", "ad", "subad", "subad", "ad", "ad", "ad", "ad", "ad", "subad", "ad", "ad", "subad", "ad", "ad", "ad", "ad", "subad", "subad", "ad", "subad", "subad", "ad", "subad", "ad"), gend = c("f", "f", "f", "f", "m", "m", "f", "m", "f", "m", "f", "f", "m", "f", "m", "f", "f", "m", "f", "m", "f", "m", "f", "m", "m", "f", "f", "f", "f", "m", "m", "f", "f", "f", "f", "m", "f", "m", "f", "f", "m", "f", "f", "f", "m", "m", "f", "f", "m", "m", "m", "m", "f", "f", "m", "m", "m", "f", "f", "f", "f", "f", "m", "f", "f", "m", "m", "f", "f", "m", "m", "m", "f"), area = c("A","B", "A", "B", "A", "B", "B", "C", "A", "B", "C", "B", "B", "B", "A", "C", "C", "A", "B", "B", "A", "B", "B", "A", "C", "A", "B", "A", "B", "B", "A", "B", "B", "A", "A", "B", "B", "C", "C", "C", "A", "B", "B", "B", "B", "C", "B", "B", "A", "B", "A", "B", "A", "B", "C", "B", "B", "A", "B", "B", "B", "B", "A", "B", "C", "A", "A", "A", "B", "A", "B", "A", "A")), class = "data.frame", row.names = c(NA, -73L)) # 加载包 library(NADA2) # 正常运行的多因子分析 cencorreg(dfr$met,dfr$cens,dfr[, c("age","gend","area")]) cencorreg(dfr$met,dfr$cens,dfr[, c("age","gend")]) cencorreg(dfr$met,dfr$cens,dfr[, c("age","area")]) # 报错的单因子分析 cencorreg(dfr$met,dfr$cens,dfr$age) cencorreg(dfr$met,dfr$cens,dfr[, c("age")]) cencorreg(dfr$met,dfr$cens,dfr$gend)
原因分析
问题出在单因子传入的格式上:
- 当传入
dfr$age或dfr[, c("age")]时,R会将单个列转换为因子向量,而非数据框; cencorreg函数的第三个参数x预期接收数据框(多列),当传入向量时,函数内部逻辑误将该因子向量当作数值变量处理,试图执行log()转换,但因子本质是带字符水平的整数编码,无法直接做对数运算,因此触发错误;- 多因子场景下,
dfr[, c("age","gend")]返回的是数据框,函数会正确识别每一列是因子并进行哑变量编码,不会触发对数转换错误。
解决办法
方法1:确保传入单个因子时返回数据框
使用drop=FALSE参数,或者将单个因子包装为数据框:
# 方式1:用drop=FALSE保留数据框格式 cencorreg(dfr$met, dfr$cens, dfr[, "age", drop=FALSE]) cencorreg(dfr$met, dfr$cens, dfr[, "gend", drop=FALSE]) # 方式2:手动包装为数据框 cencorreg(dfr$met, dfr$cens, data.frame(age = dfr$age)) cencorreg(dfr$met, dfr$cens, data.frame(gend = dfr$gend))
方法2:使用公式接口(如果支持)
部分回归类函数支持公式写法,若cencorreg支持,可尝试:
# 示例(需确认函数是否支持公式输入) cencorreg(Surv(met, cens) ~ age, data = dfr)
内容的提问来源于stack exchange,提问作者Michael Coeurdassier
相关产品推荐
相关产品推荐

