No.20483 一括で値を求める  【コロン】 2013/11/16(Sat) 09:45

いつもお世話になっております。

毎回初歩的な質問で申し訳ございませんが,例として,下記のデータの天 井・床効果を一括で求めるにはどのように記述すればよろしいのでしょうか。個々の変数でなら求めることはできるのですが.....50項目くらいありまし て,Excelで求めてしまえば良いのでは言われればそうなのですが.....。

よろしくお願いいたします。

N1 L4 T5
1 4 1 1
2 2 4 1
3 1 1 1
4 1 1 1
5 3 3 1
6 1 1 1
7 4 4 1
8 5 5 1
9 1 1 1
10 3 3 1

No.20485 Re: 一括で値を求める  【青木繁伸】 2013/11/16(Sat) 10:16

> データの天井・床効果

度数分布だけなら,データフレームを d とすれば

sapply(d, table)

で求まりますが,どのような場合に天井効果,床効果とするかの判定までひつようということなら,関数 func を定義して,以下のように

func <- function(x) {
b <- table(x)
天井効果,床効果の判定
}

sapply(d, func)

No.20487 Re: 一括で値を求める  【コロン】 2013/11/17(Sun) 09:51

青木先生

お返事ありがとうございます。やはり判定の関数を作成しなければいけないのですね。
プログラムについてはまだまだ知識不足ですので,とりあえずはExcelで計算したものを使いたいと思っております。

No.20489 Re: 一括で値を求める  【コロン】 2013/11/17(Sun) 21:19

お世話になります。

上記データについて,やはり自分で作ってみたくなり,いろいろなものを参考にトライしてみました。
が.....。うまく行きません。お時間がございましたら,加筆修正をしていただけませんでしょうか。

やりたいことは,結果を以下のように示すことです。

床効果
N1 1.3345
N2 0.5676 床効果
N3 1.7763

天井効果
N1 ...
N2 ...
N3 ... 天井効果

それぞれの効果領域においてタイトル行を縦に表示して,その横に平均-標準偏差(天井の場合は平均+標準偏差)を示し,もしそれらが床効果(天井効果)を示している場合は,さらにその横に当該項目だけ「床効果」(天井効果)と示すということです。

入力内容は,screening(データ名, 尺度値の最小部分,尺度値の最大部分)です。

******************************************************
screening<-function(x, y, z){
a <-length(x)
for (i in 1:a)
床 <- mean(x[,i]) - sd(x[,i])
if (床 < y)
floor <- "床効果"
天井<- mean(x[,i]) + sd(x[,i])
if(天井 > z)
ceiling <- "天井効果"
result <- list(床=床, 天井=天井 , floor=floor, ceiling=ceiling)
return(result)
}

print.screening<-function(obj){
cat(sprintf(colnames(x), obj$床, obj$天井, obj$floor, obj$ceiling))
}

No.20492 Re: 一括で値を求める  【コロン】 2013/11/17(Sun) 22:46

さらに調べて以下のようなものも作りました。

apply関数は,for...構文を使わなくても,一括して処理してくれることがわかりました。
確かに一部は期待した結果です。
しかし今度は判定をどのように表示すればよいのかでストップしてしまいました。

*******************************************
screening<-function(x, y, z){
平均 <- sapply(x, mean)
標準偏差 <- sapply(x, sd)
床 <- 平均 - 標準偏差
天井 <- 平均 + 標準偏差
result <- list(床=床, 天井=天井)
return(result)
}

print.screening<-function(obj){
cat(sprintf(obj$床, obj$天井))
}

No.20496 Re: 一括で値を求める  【青木繁伸】 2013/11/18(Mon) 11:56

プログラミングはいろいろですが,以下のようなものも
screening2 <- function(x, y, z) {
means <- colMeans(x)
sds <- sapply(x, sd)
床 <- ifelse(means-sds < y, "床効果", "")
天井 <- ifelse(means+sds > z, "天井効果", "")
return(data.frame(平均値=means, 標準偏差=sds,
"平均値 minus 標準偏差"=means-sds, "床効果"=床,
"平均値 plus 標準偏差"=means+sds, "天井効果"=天井))
}
実行結果は
> x <- data.frame(a=sample(5, 100, replace=TRUE), b=sample(5, 100, replace=TRUE),
c=sample(5, 100, replace=TRUE), d=sample(5, 100, replace=TRUE),
e=sample(5, 400, replace=TRUE))

> screening2(x, 1.5, 4.5)
平均値 標準偏差 平均値.minus.標準偏差 床効果 平均値.plus.標準偏差 天井効果
a 2.8600 1.343470 1.516530 4.203470
b 3.0000 1.401753 1.598247 4.401753
c 3.0000 1.518474 1.481526 床効果 4.518474 天井効果
d 2.9000 1.454403 1.445597 床効果 4.354403
e 3.0375 1.425192 1.612308 4.462692

No.20498 Re: 一括で値を求める  【コロン】 2013/11/18(Mon) 14:12

青木先生

いつも本当にありがとうございます。ループなどは不要なんですね。
return(data.frame...)勉強になりました。

ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 046 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る