我正在尝试使用 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
我该如何解决这个问题?
您收到此错误是因为
experiment
中有 144 行,但错误中提到的 nTrials
大于 144。这会导致 optFederov()
出现错误,在 caFactorialDesign()
内部调用该错误。问题源于您的 Fee
列具有相对较大的值。
我不熟悉
conjoint
包的设置方式,但我可以向您展示如何解决此错误。您可以阅读 conjoint
文档,了解有关如何选择合适的实验数据的更多信息。Fee
向量进行比较,该向量的值高达 1000。)
您可以通过突出显示函数名称(例如
caFactorialDesign
)并点击 Command-Return(在 Mac 上 - 可能在 PC 上类似)来查看加载到 RStudio 命名空间中的函数的源代码。您也可以直接查看 GitHub 上的源代码。
caFactorialDesign
在here实现。该链接突出显示了为您引发错误的行 (26):
temp.design<-optFederov(~., data, nTrials=i, approximate=FALSE, nRepeats=50)
回想一下错误信息:
nTrials 不得大于数据中的行数
您已传入
experiment
作为 data
参数,因此 nrow(experiment)
将告诉我们 nTrials
的上限是多少:
nrow(experiment) # 144
我们实际上可以将此数据集的错误视为:
n试验次数不得大于 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()
中使用如此大的值,除非您的数据中有大量的总观测值。
将您的费用变量转换为字符串以避免该错误: '''费用 = c("1000","500","100")