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

计算Pearson相关时totaldata_new.Age变量返回NA的原因排查

问题:计算Pearson相关系数时totaldata_new.Age变量返回NA的原因及解决办法

问题背景

在R语言中计算数据框Train_set内各变量与二分类目标特征PD的Pearson相关系数时,其余变量结果正常,但totaldata_new.Age变量始终返回NA。已提前移除数据中所有NA值,且尝试将该变量转为as.numeric()和as.integer()类型,问题仍未解决。

使用的代码

pearsons = c()
for (i in 1:length(colnames(Train_set))){ 
  pearsons[i] = cor(Train_set[,i], Train_set$PD, method = 'pearson')
}

数据结构(部分)

> glimpse(Train_set)
Rows: 1,219
Columns: 56
$ PD                            <dbl> 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1,…
$ gender                        <int> 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2,…
$ cancer_type                   <int> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,…
$ Treatment                     <int> 5, 6, 6, 6, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 5, 6, 5, 5, 6, 5,…
$ totaldata_new.Age             <int> 50, 66, 51, 60, 31, 70, 51, 56, 65, 62, 55, 69, 32, 82, 60, 49, 56, 59, 50, 51, 70, 74…
$ Adipocytes                    <dbl> 0.000000000, 0.000000000, 0.005592077, 0.005844092, 0.038175712, 0.000000000, 0.005063…
$ B.cells                       <dbl> 0.045214394, 1.300478781, 0.184967801, 0.032890485, 0.041641426, 0.006477740, 0.653999…
$ Basophils                     <dbl> 0.120695085, 0.065615816, 0.362173522, 0.039214941, 0.225555640, 0.056926623, 0.019076…

部分数据集结构

structure(list(PD = c(0, 0, 1, 1, 1, 1, 0, 0, 1, 1), gender = c(2L, 
2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L), cancer_type = c(3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), Treatment = c(5L, 6L, 6L, 6L, 
5L, 6L, 5L, 6L, 5L, 5L), totaldata_new.Age = c(50L, 66L, 51L, 
60L, 31L, 70L, 51L, 56L, 65L, 62L), Adipocytes = c(0, 0, 0.00559207695850587, 
0.00584409167696122, 0.0381757121622292, 0, 0.00506330308366599, 
0, 0.0156430635414994, 0), B.cells = c(0.0452143935493372, 1.30047878079526, 
0.184967800962064, 0.0328904854435036, 0.0416414264467815, 0.00647774047514386, 
0.653999365837062, 0.0331653878504112, 0.0286461940371656, 0.0888471904628742
), Basophils = c(0.120695085116671, 0.0656158162440011, 0.362173521572841, 
0.0392149412975555, 0.225555640419744, 0.0569266227666268, 0.0190762558461507, 
0.0733199539844435, 0.20291673586147, 0.0757313145147394), CD4..memory.T.cells = c(0, 
0.24081994997988, 0, 0.0084070550945875, 0, 0, 0.0704387567897827, 
0, 0.0177784010286187, 0.00653794301542519), CD4..naive.T.cells = c(0, 
0.222121262122827, 0, 0, 0, 0, 0.0337776019379054, 0, 0, 0)), row.names = c("Pt10", 
"Pt101", "Pt103", "Pt106", "Pt11", "Pt17", "Pt18", "Pt26", "Pt27", 
"Pt28"), class = "data.frame")

原因分析及解决步骤

1. 排除循环索引问题

先跳过循环,直接单独计算totaldata_new.Age与PD的相关系数,确认是否是循环逻辑导致的错误:

cor(Train_set$totaldata_new.Age, Train_set$PD, method = 'pearson')

如果单独计算仍返回NA,说明问题出在变量本身或计算逻辑,而非循环。

2. 检查变量方差

Pearson相关系数计算要求变量具有非零方差,如果totaldata_new.Age的所有取值完全相同(方差为0),cor函数会返回NA。执行以下代码检查:

# 计算方差
var(Train_set$totaldata_new.Age)
# 查看取值范围
range(Train_set$totaldata_new.Age)
# 查看唯一值数量
length(unique(Train_set$totaldata_new.Age))

若方差为0或唯一值数量为1,说明该变量无波动,无法计算Pearson相关系数。

3. 再次确认缺失值

尽管你已移除NA,但可以通过以下代码再次验证:

any(is.na(Train_set$totaldata_new.Age))
any(is.na(Train_set$PD))

若返回TRUE,说明仍存在未被清理的缺失值,需重新处理数据。

4. 使用cor.test获取详细错误信息

cor.test函数会返回更详细的统计结果及错误提示,帮助定位问题:

cor.test(Train_set$totaldata_new.Age, Train_set$PD, method = 'pearson')

如果变量方差为0,该函数会明确提示"not enough finite observations"或"variance is zero"。

5. 检查变量类型异常

虽然你已转换变量类型,但可以确认是否存在隐藏的非数值内容(如带空格的字符串):

# 查看变量的原始类型
class(Train_set$totaldata_new.Age)
# 尝试强制转换并检查是否产生NA
sum(is.na(as.numeric(as.character(Train_set$totaldata_new.Age))))

若转换后出现NA,说明原始数据中存在非数值字符,需清理后再计算。

内容的提问来源于stack exchange,提问作者Programming Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:21:11