如何将两个Likert变量正确地放入sjPlot包的一个(ggplot2)sj.likert图中?

时间:2014-05-22 10:36:11

标签: r sjplot

我有一个包含两个Likert变量的数据框。我想使用sjp.likert包的sjPlot函数绘制这两个变量。情节没有意义。

我的数据(mydf)如下所示:

structure(list(var1 = c(1, 1, 5, NA, 3, NA, 1, NA, 4, 3, 5, 5, 
4, 2, 2, NA, NA, 5, NA, NA), var2 = c(NA, NA, NA, 3, NA, 3, NA, 
5, NA, NA, NA, 2, NA, NA, NA, 4, 4, NA, 1, 1)), .Names = c("var1", 
"var2"), row.names = c(NA, 20L), class = "data.frame")

   var1 var2
1     1   NA
2     1   NA
3     5   NA
4    NA    3
5     3   NA
6    NA    3
7     1   NA
8    NA    5
9     4   NA
10    3   NA
11    5   NA
12    5    2
13    4   NA
14    2   NA
15    2   NA
16   NA    4
17   NA    4
18    5   NA
19   NA    1
20   NA    1

这是我使用的代码:

library(sjPlot)
library(RColorBrewer)

likert_5 <- mydf
levels_5 <- list(c(1,2,3,4,5))
varnames <- names(likert_5
sjp.likert(likert_5, legendLabels=levels_5, barColor="brewer",legendSize=0.5,axisLabelSize=0.5,valueLabelSize=2,colorPalette="BrBG", orderBy="pos",legendPos="bottom",axisLabels.y=varnames)

结果如下:

enter image description here

我认为你同意这根本没有意义。两个变量名称相同,有四个级别而不是五个级别。有谁知道这里出了什么问题?

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

我认为这是sjp.likert函数中的错误。逐个添加参数,我发现情节工作正常,直到包含参数orderBy = "pos"。检查函数的源代码显示:

sjp.likert
# ...
# questionCount <- nrow(pos)/(length(legendLabels)/2)
# if (!is.null(orderBy)) {
#   ...
#   orderUniqueItems <- rev(1 + questionCount - orderUniqueItems)
#   axisLabels.y <- axisLabels.y[orderUniqueItems]
# }
# ...

使用您的数据,我最终得到以下信息:

questionCount
# [1] 1.6
orderUniqueItems
# [1] 1.6 0.6
varnames[c(1.6, 0.6)]
# [1] "var1"

我认为作者实际上想要questionCount <- 上限orderUniqueItems <- c(unique(orderRelatedItems))),这会产生您的数据:

questionCount
# [1] 2
orderUniqueItems
# [1] 2 1
varnames[c(1.6, 0.6)]
# [1] "var2" "var1"

快速修复将保存返回的绘图并手动修改标签(使用作者的代码创建粘贴'n ='的标签)。

for (i in 1:length(varnames)) {
  varnames[i] <- paste(varnames[i], sprintf(" (n=%i)", length(na.omit(likert_5[,i]))), sep = "")
}
myplot <- sjp.likert(likert_5, legendLabels=levels_5, barColor="brewer", legendSize=0.5, axisLabelSize=0.5, valueLabelSize=2, colorPalette="BrBG", orderBy="pos", legendPos="bottom")
myplot$plot + scale_x_discrete(labels=varnames[c(2,1)])

编辑:

关于缺少的中间级别,我也在代码中找到了这个:

if (!is.null(neutral)) {
  out <- out[out$Response != neutral, ]
}

从输出中删除中间“中性”类别。似乎没有更改此选项的选项,the author's examples中没有一个使用奇数个类别。所以它似乎是一个功能,而不是一个错误。

您可以考虑likert包,特别是带有参数likert.bar.plot的函数include.center = TRUE