【问题标题】:error message in R : if (nomZ %in% coded) { : argument is of length zeroR 中的错​​误消息:如果(nomZ %in% 编码){:参数长度为零
【发布时间】:2016-07-15 00:28:43
【问题描述】:

我对 R(和 stackoverflow)非常陌生。我一直在尝试使用 lmres 和 pequod 包中的 simpleSlope 对我的连续 x 二分回归模型进行简单的斜率分析。

我的变量:

SLS - continuous DV csibdiff - continuous predictor (I already manually centered the variable with another code) culture - dichotomous moderator

newmod<-lmres(SLS ~ csibdiff*culture, data=sibdat2)
newmodss <-simpleSlope(newmod, pred="csibdiff", mod1="culture")

但是,在运行 simpleSlope 函数后,我收到以下错误消息:

Error in if (nomZ %in% coded) { : argument is of length zero

我不理解 nomZ 部分,但我认为我的变量有问题。这是什么意思?我的数据中根本没有 nomZ 命名的东西。我的变量都不是空类(我用 is.null() 函数检查了它们),而且我似乎没有不小心删除了变量的内容(我用 table() 函数检查了)。

如果其他人可以建议我也可以在其中进行简单斜率分析的另一个函数/包,我将不胜感激。我已经被这个问题困扰了几天了。

编辑:我将相关变量子集化为 csv 文件。

https://www.dropbox.com/s/6j82ky457ctepkz/sibdat2.csv?dl=0

【问题讨论】:

  • 表示nomZ的长度为0,表示里面没有任何内容。例如,尝试if (c() %in% 1:5) 1 else 2,很明显c() 是一个空向量。如果nomZ 不是您的变量(即,simpleSlope 的内部变量),那么您可能遇到了数学失败的奇点或其他数学场景。
  • 你能提供一个可重现的例子吗?
  • @BenBolker 我添加了数据集的链接!

标签: r


【解决方案1】:

tl;dr 看起来包的作者主要考虑的是连续版主;如果您指定 mod1="cultureEuropean"(即匹配输出中相应 parameter 的名称),该函数会返回一个答案(我不知道这是否合理......)

pequod 包 (maintainer("pequod")) 的维护者知道这个问题是对社区的一项服务...

读取数据并复制错误:

sibdat2 <- read.csv("sibdat2.csv")
library(pequod)
newmod <- lmres(SLS ~ csibdiff*culture, data=sibdat2)
newmodss <- simpleSlope(newmod, pred="csibdiff", mod1="culture")

检查数据:

summary(sibdat2)

我们在csibdiff 中确实有一些NA 值,因此请尝试删除这些...

sibdat2B <- na.omit(sibdat2)

但这实际上并没有帮助(与以前相同的错误)。

绘制数据以检查其他奇怪之处

library(ggplot2); theme_set(theme_bw())
ggplot(sibdat2B,aes(csibdiff,SLS,colour=culture))+
  stat_sum(aes(size=factor(..n..))) +
  geom_smooth(method="lm")

这里没有发生太多事情,但也没有明显的错误......

使用traceback() 大致了解问题出在哪里:

traceback()
3: simple.slope(object, pred, mod1, mod2, coded)
2: simpleSlope.default(newmod, pred = "csibdiff", mod1 = "culture")
1: simpleSlope(newmod, pred = "csibdiff", mod1 = "culture")

我们可以使用options(error=recover) 直接跳转到犯罪现场,但让我们尝试逐步调试...

debug(pequod:::simple.slope)

我们可以看到:

nomZ <- names(regr$coef)[pos_mod]
nomZ ## character(0)

再往前看,我们可以看到pos_mod 也是一个零长度整数。再往前看,我们看到代码正在通过参数名称(方差-协方差矩阵的行名称)查找修饰符的名称……但它不存在。

debug: pos_pred_mod1 <- fI + grep(paste0("\\b", mod1, "\\b"), jj[(fI + 
    1):(fI + fII)])
Browse[2]> pos_mod
## integer(0)
Browse[2]> jj[1:fI]
## [[1]]
## [1] "(Intercept)"
## 
## [[2]]
## [1] "csibdiff"
## 
## [[3]]
## [1] "cultureEuropean"
Browse[2]> mod1
## [1] "culture"

解决方案是告诉simpleSlope 寻找一个存在的变量...

(newmodss <- simpleSlope(newmod, pred="csibdiff", mod1="cultureEuropean"))
## Simple Slope:
##                              simple slope standard error   t-value   p.value
## Low cultureEuropean (-1 SD)    -0.2720128      0.2264635 -1.201133 0.2336911
## High cultureEuropean (+1 SD)    0.2149291      0.1668690  1.288011 0.2019241

我们确实收到了一些关于 NaNs produced 的警告——你必须自己深入挖掘,看看你是否需要担心它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多