【问题标题】:How to back-transform with a continuous variable如何使用连续变量进行反向变换
【发布时间】:2019-08-28 10:18:28
【问题描述】:

我想知道如何正确地对单变量线性混合效应模型的输出进行反变换以对其进行解释。我没有发布数据来配合我的问题,因为我的问题应该可以在没有数据的情况下回答。

我的模型(为本问题的目的进行了简化):

library(lme4)
m1<-lmer(activity ~ sex + BirthDate+ (1|id), data=merge.data)

> m1
Linear mixed model fit by REML ['lmerMod']
Formula: activity ~ sex + BirthDate + (1 | id)
   Data: merge.data
REML criterion at convergence: 572.0483
Random effects:
 Groups   Name        Std.Dev.
 id    (Intercept) 0.7194  
 Residual             1.4651  
    Number of obs: 150, groups:  id, 89
    Fixed Effects:
   (Intercept)            sexM       BirthDate  
      -0.08661         0.20718         0.43022  

地点:

  • activity 是一个连续响应变量
  • sex 是一个具有 2 个级别(女性和男性)的分类变量
  • BirthDate 是一个连续变量; BirthDate 是自 1 月 1 日以来的天数,然后以平均值为中心并标准化为一个标准差
  • id 是个人身份的随机效应
  • merge.data 是我的数据集的名称

BirthDate 之前是均值居中并标准化为一个标准差:

> summary(merge.data$BirthDate)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  94.96  115.96  121.96  122.67  127.96  138.96 

BirthDate 以均值为中心并标准化为一个标准差后:

merge.data<-merge.data %>%
    mutate(BirthDate = ((BirthDate-mean(BirthDate))/(1*(sd(BirthDate)))))

> summary(merge.data$BirthDate)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-3.09082 -0.74816 -0.07883  0.00000  0.59050  1.81761 

我想知道sexBirthDate 的平均值是多少。根据阅读The R Book by Crawley,我可以使用以下代码从我的模型m1 中得到平均值:

tapply(predict(m1,type="response"), merge.data$sex,mean) #gives you the back-transformed mean for sex from the model "m1"

 F           M 
-0.08334649  0.11199685

这表示女性的平均活动得分为 -0.083,男性为 0.11。

当我为BirthDate 尝试这个时,就像这样:

 tapply(predict(m1,type="response"), merge.data$BirthDate,mean)

  -3.09082367412411    -1.6406056364576   -1.52905040279094 #mean centered birth date
        -0.79030344         -0.87012920         -0.44792213 #activity score

and so on...

我最终得到的是每个出生日期的 1 个平均值(BirthDate 是均值居中并标准化为一个标准差)。与sex 不同,我无法对这些信息做任何事情......我试图展示增加出生日期对活动的影响(影响大小)。

我最终想做的是,出生日期每增加 1 天,活动得分就会增加 [来自模型的数字]。

【问题讨论】:

  • 输入ml会得到什么?
  • BirthDate 不是真正的日期,而是某个时代的天数?
  • @R5W 如果我输入 ml,什么都不会发生。 @R.S.我将澄清BirthDate 的问题。
  • 我认为@G5W 的意思是输入模型名称m1,用“1”而不是“l”。
  • @R5W 我也添加了该输出。

标签: r lme4 tapply random-effects


【解决方案1】:

当你输入m1打印出模型时,这部分:

    Fixed Effects:
   (Intercept)            sexM       BirthDate  
      -0.08661         0.20718         0.43022  

告诉您斜率,即根据输入的变化结果将发生多少变化。特别是,如果您将 Bi​​rthDate 增加 1(并保持其他所有内容不变),预测的活动得分将增加 0.43022。

您没有提供任何数据,因此我无法直接使用您的数据和模型。相反,我将用 R 中内置的一些数据来说明,虹膜数据。

## Build a linear model
Mod1 = lm(Petal.Length ~ ., data=iris[,1:4])

现在我们可以输入Mod1,但这比我想看到的要多。我们可以使用

将注意力限制在有趣的部分
Mod1$coefficients
 (Intercept) Sepal.Length  Sepal.Width  Petal.Width 
  -0.2627112    0.7291384   -0.6460124    1.4467934

这给出了每个预测变量(和截距)的斜率。 我想说明响应 Petal.Length 如何随输入而变化。 我将采取一些观点并更改一个预测器并查看结果。

NewPoint = iris[30,1:4]
NewPoint[,1] = NewPoint[,1]+1
iris[30, 1:4]
   Sepal.Length Sepal.Width Petal.Length Petal.Width
30          4.7         3.2          1.6         0.2
NewPoint
   Sepal.Length Sepal.Width Petal.Length Petal.Width
30          5.7         3.2          1.6         0.2

可以看到NewPoint和原点iris[30,1:4]是一样的 除了 Sepal.Length 增加了 1。这对预测有何影响?

predict(Mod1, newdata=iris[30,1:4])
      30 
1.386358 
predict(Mod1, newdata=NewPoint)
      30 
2.115497 
predict(Mod1, newdata=NewPoint) - predict(Mod1, newdata=iris[30,1:4])
       30 
0.7291384

预测值的差异为 0.7291384,即上面显示的 Sepal.Length 的系数。

【讨论】:

  • 我有两个后续问题:1)模型具有随机效应的因素是否改变了模型系数的解释? 2)BirthDate被标准化这一事实是否会进一步影响模型系数的解释?
  • 1.否。该模型提供基于预测变量的预测。随机部分会影响这些预测中的误差,但不会改变预测。 2. 是的。您的模型给出的斜率(变化率)适用于您构建它的变量 - 标准化日期。因此,BirthDate 0.43022 模型中的斜率适用于标准化 BirthDate 的变化。要查找原始 BirthDates 更改为 1 时的活动分数更改,您需要对结果进行缩放。更改将是(1 / sd(BirthDate)) * 0.43022
  • 好的。这就说得通了。我不明白为什么我会得到 predict(m1, data=merge.data) 行的多个输出(我原以为这是因为随机效应)?
  • (我应该澄清一下,这是我的 OP 中的 tapply(predict(m1,type="response"), merge.data$BirthDate,mean) 行)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2020-09-16
  • 2013-04-15
  • 2019-11-15
相关资源
最近更新 更多