You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:25:26