Как R lm выбирает контрасты с взаимодействием между категориальными и непрерывными переменными? - PullRequest
1 голос
/ 16 февраля 2020

Если я запускаю lm с формулой, подобной Y ~ X1 + X2:X1 + X3:X1, где X1 непрерывен, а X2, X3 категоричны, я получаю контраст для обоих уровней X2, но не X3.

Шаблон что первое категориальное взаимодействие получает оба уровня, но не второе.

library(tidyverse)
library(magrittr)
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract

df = data.frame(Frivolousness = sample(1:100, 50, replace =T))
df %<>% mutate(
  Personality=sample(c("Bad", "Good"), 50, replace = T),
  Timing=ifelse(Frivolousness %% 2 == 0 & runif(50) > 0.2, "Early", "Late")
  )
df %<>% mutate(
  Enchantedness = 11 + 
    ifelse(Personality=="Good", 0.23, -0.052)*Frivolousness -
    1.3*ifelse(Personality=="Good", 1, 0) +
    10*rnorm(50)
  )
df %<>% mutate(
  Personality = factor(Personality, levels=c("Bad", "Good")),
  Timing = factor(Timing, levels=c("Early", "Late"))
)

lm(Enchantedness ~ Personality + Timing + Timing:Frivolousness + Personality:Frivolousness, df)
#> 
#> Call:
#> lm(formula = Enchantedness ~ Personality + Timing + Timing:Frivolousness + 
#>     Personality:Frivolousness, data = df)
#> 
#> Coefficients:
#>                   (Intercept)                PersonalityGood  
#>                      15.64118                      -10.99518  
#>                    TimingLate      TimingEarly:Frivolousness  
#>                      -1.41757                       -0.05796  
#>      TimingLate:Frivolousness  PersonalityGood:Frivolousness  
#>                      -0.07433                        0.33410

lm(Enchantedness ~ Personality + Timing + Personality:Frivolousness+ Timing:Frivolousness , df)
#> 
#> Call:
#> lm(formula = Enchantedness ~ Personality + Timing + Personality:Frivolousness + 
#>     Timing:Frivolousness, data = df)
#> 
#> Coefficients:
#>                   (Intercept)                PersonalityGood  
#>                      15.64118                      -10.99518  
#>                    TimingLate   PersonalityBad:Frivolousness  
#>                      -1.41757                       -0.05796  
#> PersonalityGood:Frivolousness       TimingLate:Frivolousness  
#>                       0.27614                       -0.01636

Создано в 2020-02-15 с помощью пакета prex (v0.3.0)

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Такое странное поведение возникает из-за того, что вам не хватает основного термина Frivolousness. Если вы сделаете:

set.seed(111)
## run your data frame stuff
lm(Enchantedness ~ Personality + Timing + Timing:Frivolousness + Personality:Frivolousness, df)

Coefficients:
                  (Intercept)                PersonalityGood  
                     -1.74223                        5.31189  
                   TimingLate      TimingEarly:Frivolousness  
                     12.47243                        0.19090  
     TimingLate:Frivolousness  PersonalityGood:Frivolousness  
                     -0.09496                        0.17383  

    lm(Enchantedness ~ Personality + Timing + Frivolousness+Timing:Frivolousness + Personality:Frivolousness, df)

Coefficients:
                  (Intercept)                PersonalityGood  
                      -1.7422                         5.3119  
                   TimingLate                  Frivolousness  
                      12.4724                         0.1909  
     TimingLate:Frivolousness  PersonalityGood:Frivolousness  
                      -0.2859                         0.1738  

В вашей модели термин взаимодействия TimingLate: фривольность означает изменение наклона легкомыслия, когда время опаздывает. Поскольку значение по умолчанию не оценивается, оно должно сделать это для TimingEarly (опорный уровень). Следовательно, вы можете видеть коэффициенты для TimingEarly: легкомысленность и легкомысленность одинаковы.

Как вы видите, TimingLate: Легкомысленность очень различна, и в вашем случае я думаю, что не имеет смысла делать только термин взаимодействия без основного эффекта, потому что его сложно интерпретировать или смоделировать.

Вы можете приблизительно проверить, какой наклон для разных групп времени, и модель со всеми терминами дает хорошую оценку:

df %>% group_by(Timing) %>% do(tidy(lm(Enchantedness ~ Frivolousness,data=.)))
# A tibble: 4 x 6
# Groups:   Timing [2]
  Timing term          estimate std.error statistic p.value
  <fct>  <chr>            <dbl>     <dbl>     <dbl>   <dbl>
1 Early  (Intercept)    6.13       6.29      0.975   0.341 
2 Early  Frivolousness  0.208      0.0932    2.23    0.0366
3 Late   (Intercept)   11.5        5.35      2.14    0.0419
4 Late   Frivolousness -0.00944    0.107    -0.0882  0.930 
0 голосов
/ 16 февраля 2020

Я думаю, что причина его отбрасывания в том, что если бы он был включен, то была бы идеальная коллинеарность. Вы действительно должны иметь Легкомыслие как регрессор также самостоятельно. Затем вы увидите, что R предоставляет вам результат только для одного уровня обоих взаимодействий.

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