as.glht: невозможно преобразовать объект класса "список" в объект "glht" - PullRequest
0 голосов
/ 23 января 2019

У меня есть следующий код R:

# load data
df = read.csv("https://gist.githubusercontent.com/ZeningQu/fa4dbe5a1e82b71f7ebf6e35ec56b72b/raw/3072410fb0ea900fae4dff9cb68c5a2e2a2bab2f/bookflights.csv")
View(df)
df$Subject = factor(df$Subject) # convert to nominal factor
df$International = factor(df$International) # convert to nominal factor
df$Ease = ordered(df$Ease) # convert to ordinal factor

# analyze Ease Likert ratings on Website * International with ordinal logistic regression
library(MASS) # for polr
library(car) # for Anova
# set sum-to-zero contrasts for the Anova call
contrasts(df$Website) <- "contr.sum"
contrasts(df$International) <- "contr.sum"
m = polr(Ease ~ Website * International, data=df, Hess=TRUE) # ordinal logistic
Anova(m, type=3) 

# post hoc pairwise comparisons 
library(multcomp)
library(lsmeans) # equivalent way using lsmeans, pairs, and as.glht
summary(as.glht(pairs(lsmeans(m, pairwise ~ Website * International))),
        test=adjusted(type="none"))

Ошибка:

Error in as.glht.default(pairs(lsmeans(m, pairwise ~ Website * International))) : 
  Cannot convert an object of class ‘list’ to a ‘glht’ object

Я знаю, что это ошибка, выданная as.glht: https://github.com/cran/emmeans/blob/master/R/glht-support.R#L169 Но что я могу сделать, чтобы преобразовать pairs в glht?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Важно понять, почему это произошло.Вызов:

lsmeans(m, pairwise ~ Website * International)

фактически является сокращением для двухэтапной операции:

lsm <- lsmeans(m, ~ Website * International)
prs <- pairs(lsm)

, а результатом является список из двух emmGrid объектов, lsm и prs.

То, что вы кодировали, было as.glht(pairs(lsmeans(m, pairwise ~ Website * International))), а внутренняя часть, pairs(lsmeans(m, pairwise ~ Website * International)), уже избыточна, поскольку она генерирует парные сравнения каждого элемента результатов.Таким образом, вы получите список, состоящий из парных сравнений средних значений LS (что вам, вероятно, нужно) и парных сравнений парных сравнений (что, вероятно, не то, что вам нужно).

Вот два способаполучить результаты, которые вы хотите.Один из них - пропустить lhs формулы ...

as.glht(pairs(lsmeans(m, ~ Website * International)))

, другой - пропустить pairs() и вызвать часть результатов, которую вы хотите ...

as.glht(lsmeans(m, pairwise ~ Website * International)[[2]])

Одно из моих самых больших сожалений как разработчика lsmeans / emmeans - это чертовски двусторонний интерфейс формулы.Это создало много путаницы и много вопросов, как этот.Но я обречен держать его доступным, потому что люди так спешат получить все результаты, которые они хотят, за один шаг вместо двух.Цена удобства довольно крутая.

0 голосов
/ 23 января 2019

as.glht требуется объект класса emmGrid or emm_list, поэтому давайте проверим ваши данные:

> class(pairs(lsmeans(m, pairwise ~ Website * International)))
[1] "list"

Это не правильный класс, поэтому давайте попробуем преобразовать его

> class(lsmeans:::as.emm_list(pairs(lsmeans(m, pairwise ~ Website * International))))
[1] "emm_list" "list" 

Похоже, что это сработало, поэтому подключите его снова:

> summary(as.glht(lsmeans:::as.emm_list(pairs(lsmeans(m, pairwise ~ Website * International)))),
+         test=adjusted(type="none"))

     Simultaneous Tests for General Linear Hypotheses

Linear Hypotheses:
                               Estimate Std. Error z value Pr(>|z|)    
Expedia,0 - Orbitz,0 == 0       -2.1442     0.2619  -8.189 2.22e-16 ***
Expedia,0 - Priceline,0 == 0    -0.9351     0.2537  -3.686 0.000228 ***
Expedia,0 - Expedia,1 == 0      -1.6477     0.2570  -6.411 1.44e-10 ***
Expedia,0 - Orbitz,1 == 0       -0.3217     0.2490  -1.292 0.196380    
Expedia,0 - Priceline,1 == 0    -0.7563     0.2517  -3.004 0.002663 ** 
Orbitz,0 - Priceline,0 == 0      1.2091     0.2555   4.732 2.22e-06 ***
Orbitz,0 - Expedia,1 == 0        0.4965     0.2505   1.982 0.047498 *  
Orbitz,0 - Orbitz,1 == 0         1.8225     0.2571   7.089 1.35e-12 ***
Orbitz,0 - Priceline,1 == 0      1.3879     0.2546   5.452 4.99e-08 ***
Priceline,0 - Expedia,1 == 0    -0.7126     0.2518  -2.830 0.004659 ** 
Priceline,0 - Orbitz,1 == 0      0.6134     0.2497   2.457 0.014023 *  
Priceline,0 - Priceline,1 == 0   0.1789     0.2501   0.715 0.474476    
Expedia,1 - Orbitz,1 == 0        1.3260     0.2524   5.254 1.49e-07 ***
Expedia,1 - Priceline,1 == 0     0.8914     0.2506   3.557 0.000375 ***
Orbitz,1 - Priceline,1 == 0     -0.4345     0.2477  -1.754 0.079408 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- none method)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...