首页 > 解决方案 > R:“x”值相同,而 lambda 值在 boxcoxnc 函数中的重新划分太重

问题描述

我正在尝试使用 AID 包中的 boxcoxnc 函数来计算标准化数据,使用 Shapiro-Wilcox W 统计量来确定 lambda。

我希望 boxcoxnc 函数在 for 循环中在我的数据框中的每一列上运行。

data<-data.frame(data[,2:27])

for (f in 1:length(data)){
  model<-boxcoxnc(as.matrix(as.numeric(unlist(data[f]))),
                  method="sw",lambda = as.numeric(seq(-20,20,0.01)))
}

前三列工作正常,当我到达第四列时,我得到了错误:

Error in boxcoxnc(as.matrix(as.numeric(unlist(data[f]))), method = "sw",  : 
  Enlarge the range of the lambda

我这样做,将 lambda 的范围扩大到 (-21, -20, 0.01) ,然后在第一列得到以下错误。

Error in shapiro.test(store2[[x]]) : all 'x' values are identical

但是,数据并不完全相同。只有我的数据框中的某些列会这样做,我不知道为什么。The fourth column that calls the first error is this: 1.539 1.587 1.558 1.625 1.651 1.659 1.654 1.643 1.53 1.552 1.537 1.522 1.559 1.636 1.57 1.631 1.544 1.625 1.552 1.519 1.556 1.528 1.616 1.554 1.571 1.534 1.574 1.578 1.574 1.533 1.54 1.531 1.561 1.576 1.624 1.593 1.557 1.556 1.559 1.59

The first column is this: 6.301 6.611 6.448 7.049 7.068 7.208 7.215 7.084 6.129 6.471 6.295 5.984 6.34 7.052 6.448 6.885 6.42 6.963 6.169 6.185 6.289 6.05 6.901 6.333 6.458 6.228 6.458 6.477 6.71 6.296 6.147 6.171 6.278 6.667 6.932 6.646 6.369 6.408 6.466 6.688

非常感谢任何帮助。

标签: rnormal-distribution

解决方案


在 R 中您必须始终牢记的一件事是,根据设计,R 倾向于无论如何都继续进行,即使某些转换实际上没有意义,也会强制和转换数据。这会导致没有意义的值和错误消息,这就是这里可能发生的情况。如果您检查 的结果as.matrix(as.numeric(...)),对于这些列中的每一列,我可能都不是您所期望的。

在不确切知道如何boxcoxnc工作的情况下,我建议使用以下替代代码以使其更具可读性,甚至可能修复错误,但这可能是一个很大的问题:

for (col in 2:27) {
  model <- boxcoxnc(data[,col], method="sw", lambda = seq(-20,20,0.01))
  # what are you trying to do with model here, it is rewritten every time.
}

注释:

  1. 对原始内容进行子集化data是不必要的,因为您正在按索引遍历列。

  2. 即使什么时候data[col]可以工作(因为 data.frame 实际上是一个列列表)更适合做data[,col]。也不是length(data)你应该写ncol(data),但无论如何那个表达已经消失了。

  3. as.matrix(as.numeric(unlist(...))) 在这里似乎完全没有必要,这只是在 R 进行无意识转换方面出现问题的机会。也许 as.numeric 是必要的,如果boxcoxnc它有点特殊并且真的不能接受除了数字向量之外的任何东西。

  4. as.numeric(seq(...))可以只是sec(...);如果seq会返回除数字向量之外的任何内容,那将是令人惊讶的。

现在,您应该考虑的可能是其中一些列不包含数字数据。如果它说数字但作为字符串,那么是的,你需要as.numeric。您能否确认没有包含除数字和整数类型数据之外的任何内容的列?字符串或因素将是有问题的,并且可能是您的问题的根本原因。结果是什么:

sapply(d, class)

顺便说一句apply,方法比for循环更可取,所以也许你想走那条路,也许你会做这样的事情:

models <- sapply(data[,2:27], function(col) {  
       boxcoxnc(col, method="sw", lambda = seq(-20,20,0.01)) 
})

推荐阅读