R语言中gnm()与Dref()函数使用问题及报错求助
gnm包Dref模型问题解答
一、模型1的警告解释
运行Dref(m107_f, y19_f)时,gnm会弹出提示性警告,核心是告知你当前模型使用了默认的delta对比设置——默认用m107_f和y19_f自身的类别顺序生成两个delta变量(对应后续的delta1、delta2)。这个警告不是错误,只是提醒你:如果你的分析目标是聚焦SES的向上/向下流动这类自定义对比,需要手动指定delta参数,而非依赖默认设置。
二、delta1和delta2系数的含义
对角线参考模型(Dref)将数据分为两类:对角线组(SES未变化,即m107_f = y19_f)和非对角线组(SES发生流动)。两个delta系数的含义如下:
Dref(m107_f, y19_f)delta1:对应107月龄SES(m107_f)的类别顺序效应,衡量初始SES不同水平在“SES未流动”人群中对R_SDNN的影响差异。Dref(m107_f, y19_f)delta2:对应19岁SES(y19_f)的类别顺序效应,衡量最终SES不同水平在“SES未流动”人群中对R_SDNN的影响差异。
简单来说,这两个系数反映的是稳定SES群体中,初始/最终SES本身对因变量的作用,而非流动带来的效应。
三、模型2报错的解决方法
报错Error in eval(x) : object 'downward' not found有两个核心原因:一是delta参数的写法错误,二是流动变量创建时可能存在变量名误用。
修正步骤:
- 先将SES变量转为有序因子
要正确判断SES流动方向,必须让m107_f和y19_f的类别顺序符合逻辑(Low < MidLow < MidHigh < High):
Sey518$m107_f = factor(Sey518$m107_f, levels = c("Low", "MidLow", "MidHigh", "High"), ordered = TRUE) Sey518$y19_f = factor(Sey518$y19_f, levels = c("Low", "MidLow", "MidHigh", "High"), ordered = TRUE)
- 修正流动变量的创建逻辑
你之前用m107和y19判断流动,但实际分类变量是m107_f和y19_f,需替换为正确的变量:
Sey518$upward = ifelse(Sey518$m107_f < Sey518$y19_f, 1, 0) Sey518$downward = ifelse(Sey518$m107_f > Sey518$y19_f, 1, 0)
- 正确设置
delta参数Dref的delta参数需要接收公式形式的输入(以~开头),而非直接写变量相加,这样gnm才能在数据环境中正确识别变量:
# 修正后的Model 2 drm_SDNN_mob = gnm(R_SDNN ~ Dref(m107_f, y19_f, delta = ~ downward + upward), family = gaussian, data = Sey518)
内容的提问来源于stack exchange,提问作者OBach
相关产品推荐
相关产品推荐

