Как обратное преобразование с непрерывной переменной - PullRequest
0 голосов
/ 07 апреля 2019

Я хотел бы знать, как правильно обратно преобразовать выходные данные из одномерной линейной модели смешанных эффектов, чтобы интерпретировать ее.Я не опубликовал данные, соответствующие моему вопросу, потому что мой вопрос должен отвечать без данных.

Моя модель (упрощенная для целей этого вопроса):

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 января, а затем оно центрируется по среднему значению и стандартизируется до одного стандартного отклонения.
  • 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 

Я хотел бы знать, каково среднее значение для sex и BirthDate.Основываясь на чтении 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-дневный рост даты рождения возрастает показатель активности [число из модели].

1 Ответ

0 голосов
/ 07 апреля 2019

Когда вы распечатываете модель, набирая m1, эта часть:

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

говорит вам об уклонах, то есть насколько изменится результат в зависимости от изменения входных данных. В частности, если вы увеличите дату рождения на единицу (и оставите все остальное на прежнем уровне), прогнозируемый показатель активности увеличится на 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, показанным выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...