R:'x'值相同且在boxcoxnc函数中lambda值太重新限制

问题描述 投票:1回答:1

我试图使用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

但是,数据并不相同。我的数据框中只有某些列可以执行此操作而且我不知道原因。第四个调用第一个错误的列是: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.574 1.533 1.54 1.531 1.561 1.576 1.524 1.524 1.593 1.557 1.556 1.559 1.59

第一栏是这样的: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.906 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

任何帮助都非常感谢。

r normal-distribution
1个回答
0
投票

在R中你必须始终牢记的一件事是,设计R往往只是为了继续前进,无论是什么,强迫和转换数据,即使某些转换实际上没有意义。这导致价值和错误消息在线下没有意义,这就是这里可能发生的事情。如果你检查as.matrix(as.numeric(...))的结果,对于这些列中的每一列我可能不是你所期望的那样。

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

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是必要的iff 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)) 
})
© www.soinside.com 2019 - 2024. All rights reserved.