R语言用apply按行计算t-test报错data are essentially constant怎么解决
报错原因
单样本t检验的计算依赖样本方差推导标准误,当样本内所有观测值完全相同时,方差为0,t统计量的分母(标准误)为0无法运算,R的t.test函数会主动抛出data are essentially constant的错误。
你构造的variavel序列从1开始取值,对应数据框第一行的后15列测试值也为1,和前15列的固定值1完全一致,整行30个值全为1,刚好触发了这个校验规则,因此运行报错。
其他行的取值只有1和对应测试值两个不同值,存在方差,本身是可以正常计算t检验的。
解决方法
根据你的使用需求可以选择两种方案:
- 方案1:保留所有行,增加异常判断逻辑
在自定义计算函数中先校验样本方差,方差为0的特殊情况直接返回对应p值即可,代码示例:
p_values <- apply(X = df, MARGIN = 1, FUN = function(x) { # 处理所有值完全相同的特殊情况 if (var(x) == 0) { # 单侧检验逻辑:均值大于mu则p=0,小于则p=1,等于则p=0.5,可按需调整 mean_x <- mean(x) return(ifelse(mean_x > 2.33, 0, ifelse(mean_x < 2.33, 1, 0.5))) } t.test(x = x, mu = 2.33, alternative = "greater")$p.value })
- 方案2:过滤异常行后计算
如果不需要保留测试值为1的行的结果,直接跳过第一行即可正常运行:
# 去掉测试值为1的第一行再计算p值 p_values <- apply(X = df[-1, ], MARGIN = 1, FUN = function(x) { t.test(x = x, mu = 2.33, alternative = "greater")$p.value })
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

