R 4.1.0下针对距离矩阵的Linear model(lm)运行报错该如何处理
问题原因
这不是R 4.1.0的未公开变更,是此前版本对不规范输入的隐式兼容被取消导致的报错:
lm()的标准用法要求公式两侧的输入为向量或数据框列,你直接传入距离矩阵(尤其是dist类的紧凑三角矩阵)属于不规范输入- R 4.1.0之前的版本会自动将单维度的类矩阵对象隐式转换为向量传入模型,4.1.0对模型输入的维度校验做了严格化,要求公式中的矩阵类输入必须符合多变量模型的维度要求,单个距离矩阵不符合该要求,因此抛出维度错误。
修复方案
情况1:Dgen、Dgeo均为R原生dist类对象
直接主动将其转换为数值向量即可:
model <- lm(as.numeric(Dgen) ~ as.numeric(Dgeo))
情况2:Dgen为完整对称矩阵、Dgeo为存储为矩阵格式的三角矩阵
先提取非冗余的下三角成对距离值(排除无意义的对角线0值)再拟合:
# 提取非冗余成对距离,diag=FALSE表示排除对角线 dgen_vec <- Dgen[lower.tri(Dgen, diag = FALSE)] dgeo_vec <- Dgeo[lower.tri(Dgeo, diag = FALSE)] model <- lm(dgen_vec ~ dgeo_vec)
拟合得到的model可直接传入abline()使用,和此前的计算结果完全一致。
内容的提问来源于stack exchange,提问作者Efuchs
相关产品推荐
相关产品推荐

