#r #analysis
#r #анализ
Вопрос:
Я пытаюсь создать список совместных карт, используя R.
Я следил за введением профессора со своим собственным набором данных, но я застрял в этой проблеме, о которой я понятия не имею.
library(conjoint)
experiment<-expand.grid(
ServiceRange = c("RA", "Active", "Passive","Basic"),
IdentProce = c("high", "mid", "low"),
Fee = c(1000,500,100),
Firm = c("KorFin","KorComp","KorStrt", "ForComp")
)
print(experiment)
design=caFactorialDesign(data=experiment, type="orthogonal")
print(design)
в строке «дизайн» я продолжаю получать следующее сообщение об ошибке:
Error in optFederov(~., data, nTrials = i, approximate = FALSE, nRepeats = 50) :
nTrials must not be greater than the number of rows in data
Как мне решить эту проблему?
Ответ №1:
Вы получаете эту ошибку, потому что у вас 144 строки experiment
, но nTrials
упомянутая в ошибке становится больше 144. Это вызывает ошибку for optFederov()
, которая вызывается внутри caFactorialDesign()
. Проблема связана с тем, что ваш Fee
столбец имеет относительно большие значения.
Я не знаком с тем, как conjoint
настроен пакет, но я могу показать вам, как устранить эту ошибку. Вы можете прочитать conjoint
документацию для получения дополнительной информации о том, как выбрать подходящие экспериментальные данные.
(Обратите внимание, что данные примера в документации всегда имеют очень низкие числовые значения, обычно значения от 1 до 10. Сравните это с вашим Fee
вектором, который имеет значения до 1000.)
Вы можете увидеть исходный код функции, загруженной в ваше пространство имен RStudio, выделив имя функции (например caFactorialDesign
) и нажав Command-Return (на Mac — возможно, что-то подобное на ПК). Вы также можете просто посмотреть исходный код на GitHub.
caFactorialDesign
Здесь реализовано. Эта ссылка выделяет строку (26), которая выдает ошибку для вас:
temp.design<-optFederov(~., data, nTrials=i, approximate=FALSE, nRepeats=50)
Напомним сообщение об ошибке:
nTrials не должно быть больше, чем количество строк в данных
Вы передали в experiment
качестве data
параметра, поэтому nrow(experiment)
сообщите нам, каков верхний предел nTrials
:
nrow(experiment) # 144
На самом деле мы можем просто представить ошибку для этого набора данных как:
nTrials не должно быть больше 144
Хорошо, итак, как определяется значение для nTrials
? Мы можем видеть nTrials
, что на самом деле является аргументом optFederov()
, и его значение задается как i
— часто признак того, что операция завершается циклом for. И на самом деле, это то, что мы видим:
for (i in ca.number: profiles.number)
{
temp.design<-optFederov(~., data, nTrials=i, approximate=FALSE, nRepeats=50)
...
}
Это говорит нам о том, что optFederov()
будет вызываться для каждого значения i
в цикле, которое начнется с ca.number
и будет увеличиваться до profiles.number
(включительно).
Как назначаются эти две переменные? Если мы посмотрим немного выше в caFactorialDesign()
определении, ca.number
определяется в строках 5-9:
num <- data.frame(data.matrix(data))
vars.number<-length(num)
levels.number<-0
for (i in 1:length(num)) levels.number<-levels.number max(num[i])
ca.number<-levels.number-vars.number 1
Вы можете запускать эти вычисления вне функции — просто помните об этом data == experiment
. Так что просто измените эту первую строку на num <- data.frame(data.matrix(experiment))
, а затем запустите этот фрагмент кода. Вы можете это видеть ca.number == 1008
!!
Другими словами, самое первое значение i
в цикле for, которое вызывается optFederov()
, уже намного больше максимального предела : 1008 >> 144
.
Возможно, вы можете включить эти числовые значения в качестве факторов или строк в свое определение experiment
— я не уверен, что это подходящий способ выполнить этот анализ. Но я надеюсь, что ясно, что вы не сможете использовать такие большие значения caFactorialDesign()
, если у вас нет гораздо большего количества общих наблюдений в ваших данных.