1

我有一个带有两个李克特变量的数据框。我想通过使用包的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)

这是结果:

在此处输入图像描述

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

提前谢谢了!

4

1 回答 1

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, ]
}

这会从输出中删除中间的“中性”类别。似乎没有改变这一点的选项,而且作者的示例都没有使用奇数个类别。所以它似乎是一个特性,而不是一个错误。

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

于 2014-05-22T15:54:35.187 回答