2

Rを使用してリッカート応答を視覚化する方法に関するこの優れたエントリを利用します。

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

質問への回答は非常に役立ちますが、1つのプロット内のグループを比較することはできません。(これが機能しない場合)複数のプロットを1つの全体的なグラフに結合するのを手伝っていただければ幸いです。

どうもありがとう!

#必要なパッケージ#

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)

#Codeは、私が使用したものと同様のサンプルデータを生成します。つまり、グループ化変数(col3)と頻度での応答(col4; I)を使用して、5ポイントのリッカート尺度(col2)で測定されたステートメント項目(col1)の数です。数値が正になるように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"))

これは、データフレームのグループごとの処理を行います。データは4つの変数mydata[3:6]であり、インデックスはmydata[2]であり、関数はlikert()(HHパッケージから)です。次に、追加の引数をlikert()-に渡します。つまり、メインプロットのタイトルを空白にし、xラベルを空白にし、自動生成されたキーを右側に変更します。私は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()各要素がその変数のグループのトレリスオブジェクトであるリストになります。したがって、それぞれを1つのプロットに印刷するだけです。ご覧のとおり、最初の3つにはがmore=TRUEあります。これはRに追加のプロットを期待するように指示します。それぞれに。の引数もありますposition=c(x1,y1,x2,y2)。基本的に、各位置引数は、各プロットの左下隅と右上隅の座標を示します。このSO回答からもう少し情報が入手できます。

この結果は、添付のプロットです。完璧ではありませんが、スタートだと思います。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から最後から2番目のプロットまでループします(最後のプロットなので、削除する必要がありmore=TRUEます。位置はトリッキーな部分ですが、それでもそれほど悪くはありません。x1は常にゼロになり、x2は常に進みます。 1(左下と右上隅)になります。1(アイテムの上部)を取り、減算することでy1の値を取得しますx*1/dim(items_byg)。したがって、5つのアイテムがある場合、最初のアイテムの下部コーナーは1-( 1)(1/5)、つまり0.8。2番目は1-(2)(1/5)、つまり0.6などです。y2はy1よりも1次元大きいだけです(つまり、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 に答える