Функция Conjoint () в R - PullRequest
       62

Функция Conjoint () в R

0 голосов
/ 17 марта 2020

У меня проблема с выводом объединенной функции. У меня есть 5 атрибутов с 3 уровнями для каждого атрибута, но в выводе, начатом со второго атрибута на третьем уровне, результатом является NA, и я не знаю, что я могу сделать, чтобы решить проблему. Вот мой код и результат объединенной функции (img. Выходная объединенная функция).

Можете ли вы мне помочь, пожалуйста?

alimentatie<-c("mancare gatita","fast food","amandoua in mod alternativ") 

activitati<-c("regulat","de cateva ori pe luna","foarte rar")

bauturi<-c("evit cat de mult pot","oricat de des simt nevoia","ocazional")

odihna<-c("7-8 ore","4-6 ore","mai mult de 8 ore")

Recreere<-c("3-6","mai mult de 6","mai putin de 3")

factor_levels<-as.data.frame(c(alimentatie,activitati,bauturi,odihna,recreere))

colnames(factor_levels)<-"levels"

data<-expand.grid(alimentatie,activitati,bauturi,odihna,recreere)

colnames(data)<-c("Alimentatie","Activitati","Bauturi","Odihna","Recreere")


facdesign_full<-caFactorialDesign(data = data, type = "full")

encdesign_full<-caFactorialDesign(facdesign_full)


response<-read.table("cc.txt", sep="\t",header = T)
response<-as.data.frame(response)


conjoint_analysis<-Conjoint(response,encdesign_full,factor_levels)

Я закодировал каждый ответ (всего 59 ответов) для 5 вопросов со значениями «0 1 и 2» в виде:

Alimentatie: "mancare gatita" code 0, "fast food" code 1 ,"amandoua in mod alternativ" code 2; 
Activitati: "regulat" code 0,"de cateva ori pe luna" code 1,"foarte rar" code 2; 
Bauturi: "evit cat de mult pot" code 0,"oricat de des simt nevoia" code 1 ,"ocazional" code 2; 
Odihna: "7-8 ore" code 0,"4-6 ore" code 1,"mai mult de 8 ore" code 2;
Recreere: "3-6" code 0,"mai mult de 6" code 1,"mai putin de 3" code  2

я приложил фотографию (данные) с частью файла cc .csv (потому что появляется текстовый файл смещение).

Данные: Канал данных

dput(rasps)
structure(list(`Profil 1` = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, 0L, 2L, 0L, 2L, 0L, 1L, 2L, 0L, 2L, 0L, 2L, 0L, 0L, 2L, 0L, 
2L, 0L, 0L, 0L, 2L, 2L, 2L, 0L, 0L, 0L, 0L, 2L, 0L, 2L, 0L, 0L, 
2L, 2L, 0L, 0L, 2L, 0L, 2L, 2L, 0L, 2L, 2L, 1L, 0L, 2L, 0L, 2L, 
2L, 0L, 1L), `Profil 2` = c(1L, 1L, 0L, 2L, 1L, 1L, 2L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 2L, 2L, 0L, 0L, 1L, 1L, 2L, 1L, 
2L, 0L, 0L, 2L, 1L, 1L, 0L, 0L, 1L, 0L, 2L, 1L, 2L, 2L, 1L, 1L, 
2L, 2L, 0L, 2L, 0L, 1L, 2L, 0L, 2L, 2L, 2L, 0L, 2L, 1L, 1L, 1L, 
2L, 2L), `Profil 3` = c(2L, 0L, 0L, 2L, 0L, 2L, 1L, 0L, 0L, 2L, 
1L, 1L, 0L, 0L, 1L, 2L, 2L, 2L, 0L, 2L, 0L, 0L, 2L, 2L, 1L, 2L, 
0L, 0L, 0L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 0L, 1L, 2L, 1L, 0L, 1L, 
2L, 0L, 1L, 0L, 2L, 2L, 1L, 1L, 2L, 1L, 0L, 2L, 2L, 1L, 1L, 0L, 
2L), `Profil 4` = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 2L, 0L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 2L, 0L, 1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 1L
), `Profil 5` = c(0L, 1L, 2L, 0L, 0L, 2L, 0L, 2L, 2L, 2L, 2L, 
0L, 0L, 0L, 1L, 2L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 2L, 
0L, 2L, 1L, 0L, 0L, 2L, 2L, 0L, 0L, 2L, 2L, 1L, 1L, 1L, 0L, 0L, 
2L, 0L, 1L, 0L, 0L, 2L, 2L, 2L, 2L, 0L, 2L, 0L, 0L, 0L, 2L, 2L
)), class = "data.frame", row.names = c(NA, 59L))

Данные

После обновления код:

После обновления

Выходная объединенная функция:

Output conjoint function

1 Ответ

0 голосов
/ 19 марта 2020

Ваш оригинальный код вызывает функцию caFactorialDesign дважды, в двух последовательных строках. Тем не менее, согласно conjoint виньетка , caEncodedDesign равна

, функция [которая] кодирует факторный план, полученный с помощью функции caFactorialDesign, для нужд совместного функционирования модуля

Исходя из этого, я полагаю, что одной из проблем является то, что ваш второй caFactorialDesign звонок неверен. Возможно, вам следует вместо этого вызвать caEncodedDesign, чтобы сгенерировать объект encdesign_full. Поэтому попробуйте настроить свой код так:

    # replace the line encdesign_full <- caFactorialDesign(facdesign_full) with
    encdesign_full <- caEncodedDesign(facdesign_full)

Кроме того, здесь ваш код переписан более компактным и воспроизводимым способом:

    # load library
    library(conjoint)

    # combinations of levels
    data <- expand.grid(
      alimentatie = c("mancare gatita","fast food","amandoua in mod alternativ"), 
      activitati = c("regulat","de cateva ori pe luna","foarte rar"),
      bauturi = c("evit cat de mult pot","oricat de des simt nevoia","ocazional"),
      odihna = c("7-8 ore","4-6 ore","mai mult de 8 ore"),
      recreere = c("3-6","mai mult de 6","mai putin de 3"))

    # profile
    facdesign_full <- caFactorialDesign(data = data, type = "full")
    profile <- caEncodedDesign(facdesign_full)

    # level names
    levelnames <- data.frame(
      levels = c("mancare gatita","fast food","amandoua in mod alternativ",
      "regulat","de cateva ori pe luna","foarte rar","evit cat de mult pot",
      "oricat de des simt nevoia","ocazional", "7-8 ore","4-6 ore",
      "mai mult de 8 ore","3-6","mai mult de 6","mai putin de 3")
  )
# preferences
    response <- structure(list(alimentatie = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
      0L, 0L, 2L, 0L, 2L, 0L, 1L, 2L, 0L, 2L, 0L, 2L, 0L, 0L, 2L, 0L, 
      2L, 0L, 0L, 0L, 2L, 2L, 2L, 0L, 0L, 0L, 0L, 2L, 0L, 2L, 0L, 0L, 
      2L, 2L, 0L, 0L, 2L, 0L, 2L, 2L, 0L, 2L, 2L, 1L, 0L, 2L, 0L, 2L, 
      2L, 0L, 1L), activitati = c(1L, 1L, 0L, 2L, 1L, 1L, 2L, 0L, 0L, 
      0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 2L, 2L, 0L, 0L, 1L, 1L, 2L, 1L, 
      2L, 0L, 0L, 2L, 1L, 1L, 0L, 0L, 1L, 0L, 2L, 1L, 2L, 2L, 1L, 1L, 
      2L, 2L, 0L, 2L, 0L, 1L, 2L, 0L, 2L, 2L, 2L, 0L, 2L, 1L, 1L, 1L, 
      2L, 2L), bauturi = c(2L, 0L, 0L, 2L, 0L, 2L, 1L, 0L, 0L, 2L, 
      1L, 1L, 0L, 0L, 1L, 2L, 2L, 2L, 0L, 2L, 0L, 0L, 2L, 2L, 1L, 2L, 
      0L, 0L, 0L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 0L, 1L, 2L, 1L, 0L, 1L, 
      2L, 0L, 1L, 0L, 2L, 2L, 1L, 1L, 2L, 1L, 0L, 2L, 2L, 1L, 1L, 0L, 
      2L), odihna = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 2L, 0L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
      0L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 2L, 0L, 1L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 1L), 
      recreere = c(0L, 1L, 2L, 0L, 0L, 2L, 0L, 2L, 2L, 2L, 2L, 
      0L, 0L, 0L, 1L, 2L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 
      2L, 0L, 2L, 1L, 0L, 0L, 2L, 2L, 0L, 0L, 2L, 2L, 1L, 1L, 1L, 
      0L, 0L, 2L, 0L, 1L, 0L, 0L, 2L, 2L, 2L, 2L, 0L, 2L, 0L, 0L, 
      0L, 2L, 2L)), class = "data.frame", row.names = c(NA, -59L))

Обратите внимание на это, указав "полный" В проекте profile объект имеет 243 строки, в то время как ваш объект response имеет только 59:

dim(profile)
[1] 243 5
dim(response)
[1] 59 5

Кажется, что это сбивает с толку функцию Conjoint, я полагаю, потому что она ищет 243 строки данные в объекте response.

Фактически, если вы добавите 184 строки моделируемых данных к объекту response, Conjoint, похоже, даст желаемый результат:

    # simulated response data
    set.seed(1)
    response_sim <- data.frame(alimentatie = sample(0:2, 184, replace = T),
      activitati = sample(0:2, 184, replace = T),
      bauturi = sample(0:2, 184, replace = T),
      odihna = sample(0:2, 184, replace = T),
      recreere = sample(0:2, 184, replace = T))

    # append simulated preferences
    response_n243 <- rbind(response, response_sim)

    # run 
    Conjoint(response_n243,profile, levelnames)

Console image

Заключение

Похоже, что ваша проблема связана с тем, что в вашем объекте response меньше данных, чем требуется для выполнения "полного" факториального проектирования. Похоже, вам может потребоваться предоставить больше response данных или пересмотреть свой дизайн, уделяя особое внимание аргументу type caFactorialDesign. «Дробный» дизайн может быть альтернативой.

...