2016-07-15 385 views
2

我对R(和stackoverflow)很新。我一直试图对我使用lmres的连续x二分回归模型和pequod包中的simpleSlope进行简单的斜率分析。在R中的错误消息:if(nomZ%in%coded){:参数的长度为零

我的变量:

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

+0

这意味着'nomZ'长度为0,这意味着它没有任何内容。例如,尝试'if(c()%in%1:5)1 else 2',这显然是'c()'是一个空向量。如果'nomZ'不是你的变量(即,在'simpleSlope'内部),那么你可能会遇到奇点或数学失败的其他数学场景。 – r2evans

+0

你能提供一个可重复的例子吗? –

+0

@BenBolker我添加了一个数据集的链接! – user6591823

回答

1

TL;博士它看起来像包的作者进行了初步思考连续版主;如果指定mod1="cultureEuropean"(即以匹配输出相应的参数的名称)该函数返回一个答案(我不知道,如果它是明智的或不...)

这将是对服务社区让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) 

我们确实有一些csibdiffNA,所以尽量除去这些...

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") 

enter image description here

有没有什么会在这里,但没有明显的错误要么...

使用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一些警告 - 你必须挖掘自己更远看看你是否需要担心他们。

相关问题