我试图使用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中你必须始终牢记的一件事是,设计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.
}
评论:
data
进行子集化。data[col]
工作(因为data.frame实际上是列的列表)更适合做data[,col]
。而不是length(data)
你应该写ncol(data)
,但无论如何表达已经消失。boxcoxnc
有点特别,除了数字向量之外真的不能接受任何东西。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))
})