1

将来のデータ分析を効率化するために、data.frame に含まれるさまざまな自己報告スケールを識別し、各スケールのアイテムに対して定期的な分析を実行するスクリプトを作成しようとしています。現在、どのスケールが存在するかを識別し、スケールの各アイテムの応答を見つけて、各スケールのクロンバックのアルファを計算したいと考えています。

各スケールの alpha() 出力のリストを生成する関数を実行すると、次のエラーが発生します。

    > Cronbach.Alphas(scales.data, scale.names)
       Error in alpha(data[, responses[[i]]]) : 
       Data must either be a data frame or a matrix

明らかに、これは alpha() 関数に与えられる情報が data.frame またはマトリックスではないことを示していることを知っています。私がとても混乱している理由は、これらの計算を Cronbach.Alphas() 関数の外で手動で段階的に行うと、それが data.frame であり、魅力のように機能するように見えることです:

    > class(scales.data[,responses[[1]]])
    [1] "data.frame"

これは私を夢中にさせており、これを理解するための助けに非常に感謝しています. 私の完全なコードを以下に貼り付けます。(注:私はRで関数をプログラミングするのはかなり初めてなので、私がやっている方法はおそらく最適ではありません。追加のアドバイスも大歓迎です。)

また、私のコードは、列名にアンダースコアが含まれているかどうかに基づいてスケール名を識別するように設計されていることに言及することも役立つかもしれません。つまり、「rsq_12」はスケールが rsq であり、列がスケールの項目 12 に対する応答であることを示します。

   require(psych)

   ##### Function for identifying names of scales present in the data file #####
   GetScales <- function(x) {
     find.scale.names <- regexec("^(([^_]+)_)", colnames(x))
     scales <- do.call(rbind, lapply(regmatches(colnames(x), find.scale.names), `[`, 3L))
     colnames(scales) <- "scale"
     na.find <- ifelse(is.na(scales[,1]), 0, 1)
     scales <- cbind(scales, na.find)
     output <- scales[scales[,2] == 1,]
     output[,1]
   }

   ##### Function for calculating cronbach's alpha for each scale #####
   Cronbach.Alphas <- function(data, scales){
     for(i in 1:length(scales)){
       if(i == 1) {
         responses  <- list(grep(scales[i], colnames(data)))
         alphas <- list(alpha(data[,responses[[i]]]))
       } else {
         responses  <- append(responses, list(grep(scales[i], colnames(data))))
         alphas <- append(alphas, list(alpha(data[,responses[[i]]])))
       }
     }
     return(alphas)
   }

   ### Import data from .csv file ###
   scales.data <- data.frame(read.csv(file.choose()))

   ### Identify each item's scale ###
   scale.items <- GetScales(scales.data)

   ### Reduce to names of scales ###
   scale.names <- cbind(scale.items, !duplicated(scale.items))
   scale.names <- scale.names[scale.names[,2] == TRUE, 1]
   scale.names

   ### Calculate list of alphas ###
   Cronbach.Alphas(scales.data, scale.names)
4

1 に答える 1

0

時間をかけて私のコードを調べてくれた人に感謝します。私はあなたの助けに感謝します。ここに残されている提案に取り組んでいたときに、自分の単純な間違いに気付きました...

このスクリプトの作業中にテストとして使用したデータセットのスケールの 1 つには、項目が 1 つしかありませんでした。したがって、私の Cronbach.Alphas() 関数の data[,responses[[i]]] は、for ループのその時点で alpha() 関数に (data.frame または行列ではなく) ベクトルを渡していました。アイテム間の信頼性の指標であるため、単一アイテム スケールの cronbach アルファを計算することは不可能です...

すっごく、私のコードで必要だったのは、たった 1 つのアイテムでスケールを識別する方法だけでした。

    Cronbach.Alphas <- function(data, scales){
      for(i in 1:length(scales)){
        if(i == 1) {
          responses  <- list(grep(scales[i], colnames(data)))
          if(length(responses[[i]]) > 1){
            alphas <- list(alpha(data[,responses[[i]]]))
          }
        } else {
          responses  <- append(responses, list(grep(scales[i], colnames(data))))
          if(length(responses[[i]]) > 1){
            alphas <- append(alphas, list(alpha(data[,responses[[i]]])))
          }
        }
      }
      return(alphas)
    }

私のミスで誰かの時間を無駄にしてごめんなさい。プラス面として、この新しい Cronbach.Alphas() 関数を上記のスクリプトに代入することで、スケールを自動的に識別し、cronbach のアルファのリストを生成するスクリプトを投稿しました (列の名前の後にアンダースコアが付けられている場合)。スケール名)興味のある人のために。再度、感謝します!

于 2013-02-23T16:00:04.500 に答える