2

我借鉴了这篇关于如何使用 R 可视化李克特响应的优秀条目:

[ https://stats.stackexchange.com/questions/25109/visualizing-likert-responses-using-r-or-spss ]

尽管问题的答案非常有帮助,但我无法在一个情节中比较组。(如果这不起作用)如果您帮助我将多个图组合成一个整体图,我将不胜感激。

非常感谢!

#需要的包裹#

install.packages(c('devtools', 'roxygen2', 'RSQLite', 'ipeds','reshape'), repos=c('http://cran.r-project.org', 'http://r-forge.r-project.org'))
require(devtools)
require(roxygen2)

library(ggplot2)
library(HH)
library(reshape)
library(gridExtra)

#生成类似于我使用的样本数据的代码,即通过 5 点李克特量表 (col2) 测量的多个陈述项目 (col1),具有分组变量 (col3) 和频率响应 (col4; I设置 mean 和 sd 使数字为正)。#

mydata1<-expand.grid(col1=c('item1', 'item2', 'item3', 'item4'), col2=c('0', '1', '2', '3', '4'), col3=c('T1'))
m<-2:7
s<-0:1
mydata1$col4=sapply(rnorm(20,m,s), function(x) {round(x,2)})
mydata1$col2<-factor(mydata1$col2, levels=c(0,1,2,3,4), labels=c("strongly disagree", "disagree", "neutral", "agree", "strongly agree"), ordered=TRUE)
mydata1<-reshape(mydata1, direction="wide", v.names="col4", timevar="col2", idvar="col1")

mydata2<-expand.grid(col1=c('item1', 'item2', 'item3', 'item4'),col2=c('0', '1', '2', '3', '4'),col3=c('T0'))
m<-2:7
s<-0:1
mydata2$col4=sapply(rnorm(20,m,s), function(x) {round(x,2)})
mydata2$col2<-factor(mydata2$col2, levels=c(0,1,2,3,4),labels=c("strongly disagree", "disagree", "neutral", "agree", "strongly agree"), ordered=TRUE)
mydata2<-reshape(mydata2, direction="wide", v.names="col4", timevar="col2", idvar="col1")

mydata3<-expand.grid(col1=c('item1', 'item2', 'item3', 'item4'),col2=c('0', '1', '2', '3', '4'),col3=c('C1'))
m<-2:7
s<-0:1
mydata3$col4=sapply(rnorm(20,m,s), function(x) {round(x,2)})
mydata3$col2<-factor(mydata3$col2,levels=c(0,1,2,3,4),labels=c("strongly disagree", "disagree", "neutral", "agree", "strongly agree"), ordered=TRUE)
mydata3<-reshape(mydata3, direction="wide", v.names="col4", timevar="col2", idvar="col1")

mydata4<-expand.grid(col1=c('item1', 'item2', 'item3', 'item4'),col2=c('0', '1', '2', '3', '4'),col3=c('C0'))
m<-2:7
s<-0:1
mydata4$col4=sapply(rnorm(20,m,s), function(x) {round(x,2)})
mydata4$col2<-factor(mydata4$col2,levels=c(0,1,2,3,4), labels=c("strongly disagree", "disagree", "neutral", "agree", "strongly agree"), ordered=TRUE)
mydata4<-reshape(mydata4, direction="wide", v.names="col4", timevar="col2", idvar="col1")

mydata<-rbind(mydata1, mydata2, mydata3, mydata4)
summary(mydata)

#准备资料#

mydata$col4.neutral<-NULL
colnames(mydata)[colnames(mydata)=="col4.strongly disagree"]<-"Strongly disagree"
colnames(mydata)[colnames(mydata)=="col4.disagree"]<-"Disagree"
colnames(mydata)[colnames(mydata)=="col4.agree"]<-"Agree"
colnames(mydata)[colnames(mydata)=="col4.strongly agree"]<-"Strongly agree"

#阴谋#

items<-mydata[, c("Strongly disagree", "Disagree", "Agree", "Strongly agree")]
itemsg=likert(items, grouping =mydata$col3) 
plot(itemsg)

问题:代码产生一个单一的情节,但不进行组间比较。似乎它绘制了在mydata中出现的每个项目,因此如果我们设法重新排序行,我们可能能够生成一个允许在项目和组之间进行轻松比较的图。

> ro.mydata
            col1 col3 Strongly disagree Disagree Agree Strongly agree
item1 (T1) item1   T1              2.00     6.00  2.00           6.00
item1 (T0) item1   T0              2.00     6.00  2.00           6.00
item2 (T1) item2   T1              1.90     6.59  2.67           8.33
item2 (T0) item2   T0              3.57     6.76  3.23           9.03
item3 (T1) item3   T1              4.00     2.00  4.00           2.00
item3 (T0) item3   T0              4.00     2.00  4.00           2.00
item4 (T1) item4   T1              7.02     2.66  6.31           2.76
item4 (T0) item4   T0              3.56     3.63  4.74           3.21
item1 (C1) item1   C1              2.00     6.00  2.00           6.00
item1 (C0) item1   C0              2.00     6.00  2.00           6.00
item2 (C1) item2   C1              4.01     6.87  2.62           6.23
item2 (C0) item2   C0              2.95     5.95  3.69           5.36
item3 (C1) item3   C1              4.00     2.00  4.00           2.00
item3 (C0) item3   C0              4.00     2.00  4.00           2.00
item4 (C1) item4   C1              4.10     2.54  6.12           2.62
item4 (C0) item4   C0              4.57     1.94  3.64           2.86
>

在此处输入图像描述

4

1 回答 1

4

所以,这有点超出我的专业知识,因为底层函数使用 R 中的格子绘图功能,而我并没有真正使用它。by()话虽如此,我相信有一种方法可以通过处理每个调用来完成您想要的事情likert(),然后使用布局参数将它们绘制在一个图中。

从...开始:

items_byg <- by(data=mydata[3:6],
                INDICES=mydata[2],
                FUN=likert,
                main="",xlab="",auto.key=list(columns=1,space="right"))

这会按组处理您的数据框 - 数据是四个变量mydata[3:6],索引是mydata[2],函数是likert()(来自 HH 包)。然后,将附加参数传递给likert()- 即,使主图标题为空白,x-labels 为空白,并将自动生成的密钥更改为右侧。我并不完全熟悉 auto.key 的参数,但?barchart会提供一些信息。

下一个:

print(items_byg[[1]],position=c(0,0.75,1,1),more=TRUE)
print(items_byg[[2]],position=c(0,0.5,1,0.75),more=TRUE)
print(items_byg[[3]],position=c(0,0.25,1,0.5),more=TRUE)
print(items_byg[[4]],position=c(0,0,1,0.25))

的输出by()将是一个列表,其中每个元素都是该组变量的网格对象。因此,我们只是将它们中的每一个打印到一个图上。如您所见,前三个有more=TRUE,它告诉 R 期待额外的情节。每个也有一个论点position=c(x1,y1,x2,y2)。基本上,每个位置参数都给出了每个图的左下角和右上角的坐标。可以从这个 SO answer获得更多信息。

其结果是所附的情节。到目前为止,它并不完美,但我认为这是一个开始。请注意by(),如果您想直观地比较各组之间的每个问题,您可以将组更改为按问题分组,而不是按组。

显然,您仍然需要解决一些问题,例如使所有内容排列整齐并消除重复的键-那里存在一些挑战-但原则上,我相信这可以实现您想要的-很好地分组和堆叠的条形图。

使用格子的堆积图示例

编辑添加

在查看了您所说的内容后,我做了一些我认为对您有用的调整。从按项目排序数据开始:

mydata <- mydata[order(mydata[1]),]

接下来,我们仍将使用by()来获取组,但有一些更改。首先,我们使用项目作为索引,而不是组(因为您想直观地比较组)。因此,生成的每个图都将围绕一个项目。我们设置ylab为“组”,并使用比例尺用组名称标记 y 轴。

items_byg <- by(data=mydata[3:6],
                INDICES=mydata[1],
                FUN=likert,
                main="",xlab="",ylab="Groups",auto.key=list(columns=1,space="right"),
                scales=list(y=list(labels=mydata[[2]])))

现在,我们可以使用循环来运行绘图。我们从 1 循环到倒数第二个图(因为它是最后一个图,我们需要删除more=TRUE。位置是棘手的部分,但即使这样也不算太糟糕。x1 总是为零,x2 总是在为 1(左下角和右上角)。我们通过取 1(项目的顶部)并减去 得到 y1 的值x*1/dim(items_byg)。因此,如果您有 5 个项目,第一个项目的下角位于 1-( 1) (1/5),即 0.8。第二个在 1-(2) (1/5),即 0.6,依此类推。y2 仅比 y1 大一维(因此,如果 y1 为 0.8 , y2 应该是 1.0,以此类推)。我们还根据 x 为每个项目添加一个项目标题,然后将所有内容提供给打印。

for(x in 1:(dim(items_byg)-1)) {

    x1 <- 0
    y1 <- 1-(x*(1/dim(items_byg)))
    x2 <- 1
    y2 <- y1+(1/dim(items_byg))

    items_byg[[x]]$main <- paste("Item",x,sep=" ")
    print(items_byg[[x]],position=c(x1,y1,x2,y2),more=TRUE)
}

最后一点是完成最后的情节——创建一个项目编号,然后做最后的print()(这需要分开,这样你就不会得到另一个more=.

items_byg[[dim(items_byg)]]$main <- paste("Item",dim(items_byg),sep=" ")
print(items_byg[[dim(items_byg)]],position=c(0,0,1,0+(1/dim(items_byg))))

运行这个,我得到下面的图像,它应该很容易推广到多个项目。

在此处输入图像描述

于 2012-09-05T14:18:41.583 回答