2013-02-23 4 views
1

Чтобы упорядочить анализ будущих данных, я пытаюсь написать сценарий, который будет определять различные шкалы самоотчетов, включенные в файл data.frame, и выполнять рутинные анализы для каждого объекта шкалы. В настоящее время я хочу, чтобы он определил, какие масштабы присутствуют, найдите ответы для каждого из предметов шкалы, а затем вычислите Альфах Кронбаха для каждой шкалы.Переменный класс отличается внутри функции?

Все, кажется, работает только, когда я запускаю свою функцию, которая должна произвести список альфа() выводит для каждого масштаба я получаю следующее сообщение об ошибке:

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

Очевидно, что я знаю, что это говорит информация присвоение функции alpha() не является кадром данных или матрицей. Причина, по которой я так запуталась, заключается в том, что когда я делаю эти вычисления вручную шаг за шагом вне моей функции 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) 
+0

Помогает ли добавить альфа (данные [, ответы [[i]], drop = FALSE]) '? –

ответ

0

Спасибо всем, кто нашел время, чтобы просмотреть мой код. Я ценю вашу помощь. Я работал над предложениями, оставленными здесь, когда я понял простую ошибку с моей стороны ...

Одна из шкал в наборе данных, которую я использовал в качестве теста при работе над этим скриптом, имела только один элемент в этом. Таким образом, данные [, ответы [[i]]] в моей функции Cronbach.Alphas() передавали вектор (а не кадр данных или матрицу) в функцию alpha() в этой точке цикла for. Это невозможно вычислить Кронбах альфа для одного масштаба элемента, так как это показатель надежности между товаром ...

Sooooo, весь мой код нужен был способ, чтобы определить масштабы всего лишь один пункт:

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 (если столбцы будут названы с подчеркиванием после масштабные имена) для всех, кто может заинтересоваться. Еще раз спасибо!

Смежные вопросы