在R的nlme中使用weights参数时遇维度不匹配错误求助
问题分析
报错核心是varFixed(~WEIV)生成的权重向量长度(52)与观测总数(220)不匹配,原因是WEIV是按OBSID聚合的单一可信度值,未扩展到每个观测行,导致权重无法对应所有观测。
解决方案
- 补全观测级权重
确保数据集testdummy10中每个观测行都有对应的WEIV值。如果WEIV仅存储在OBSID级别,将其合并到主数据集,让每个观测继承对应OBSID的可信度:
# 提取OBSID与WEIV的唯一对应关系 obs_weights <- unique(testdummy10[, c("OBSID", "WEIV")]) # 合并权重到主数据集,确保每个观测都有WEIV值 testdummy10 <- merge(testdummy10, obs_weights, by = "OBSID", all.x = TRUE)
- 重新运行模型
补全权重后,原模型代码即可正常运行:
coeffs_start = lm(log(DEPV)~log(INDV), filter(testdummy10,DEPV!=0))$coefficients nlme_fit <- nlme(DEPV ~ a*INDV^b, data = testdummy10, fixed=a+b~ 1, random = a~ 1, groups = ~ PARTID, start = c(a=exp(coeffs_start[1]), b=coeffs_start[2]), verbose = F, method="REML", weights=varFixed(~WEIV))
说明
varFixed(~WEIV)的用法是合理的:若WEIV代表观测可信度(值越高越可信),该设置会让高可信度观测在拟合时拥有更高权重(对应更小的方差贡献),符合你的建模需求。
内容的提问来源于stack exchange,提问作者FloLe
相关产品推荐
相关产品推荐

