R语言使用boxcox变换时报错响应变量必须为正如何解决?
报错原因
Box-Cox变换的数学约束要求响应变量必须为严格正实数,你收到该报错是因为回归模型中的响应变量Score1存在0值或负数值。
解决方案
方案1:给响应变量添加极小偏移量(适配原生boxcox函数的最简方案)
先确认Score1的取值范围,再添加略大于最小非正值绝对值的偏移量,保证所有值转为正数后再拟合模型:
# 先查看Score1的取值范围 range(Score1) # 计算偏移量:如果最小值≤0,偏移量为最小值的绝对值加1e-6(极小值避免刚好等于0) offset <- abs(min(Score1)) + 1e-6 # 拟合加入偏移后的线性模型 md <- lm(I(Score1 + offset) ~ Location1 + Site1 + Trial1 + Stage1) summary(md) plot(md, which = 1) # 再运行boxcox变换 bc <- boxcox(md, plotit = T, lambda = seq(0.5,1.5, by =0.1))
注意:偏移量不要设置过大,避免改变原始数据的分布特征。
方案2:使用Yeo-Johnson变换(无需响应变量为正的改进版幂变换)
如果不想修改原始响应变量,可以使用适配非正值的Yeo-Johnson变换,调用car包的powerTransform函数实现:
# 先加载car包 library(car) # 拟合原始模型 md <- lm(Score1 ~ Location1 + Site1 + Trial1 + Stage1) # 执行Yeo-Johnson变换 yj <- powerTransform(md, family = "yjPower") # 提取最优lambda值 lambda <- yj$lambda # 用最优lambda变换响应变量后重新拟合模型 md_transformed <- lm(yjPower(Score1, lambda) ~ Location1 + Site1 + Trial1 + Stage1)
额外提示
如果你的Score1是0-1区间的比例数据,之前的反正弦变换效果不佳的话,也可以尝试给0/1值添加极小偏移后做logit变换,适配比例数据的分布特征。
内容的提问来源于stack exchange,提问作者Muneera Dabhelia
相关产品推荐
相关产品推荐

