r - 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
非常感谢任何帮助。
解决方案
在 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.
}
注释:
对原始内容进行子集化
data
是不必要的,因为您正在按索引遍历列。即使什么时候
data[col]
可以工作(因为 data.frame 实际上是一个列列表)更适合做data[,col]
。也不是length(data)
你应该写ncol(data)
,但无论如何那个表达已经消失了。as.matrix(as.numeric(unlist(...))) 在这里似乎完全没有必要,这只是在 R 进行无意识转换方面出现问题的机会。也许 as.numeric 是必要的,如果
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))
})
推荐阅读
- ios - UIBlurEffect 不会模糊 UITableViewCell 中的整个图像
- google-places-api - 使用令牌自动完成的会话定义
- postgresql - 当我将表结构传递到 gorm 上的 db.Create() 时,外键被省略
- android - android 11 中的文件访问给出异常 java.io.FileNotFoundException: open failed: EACCES (Permission denied)
- r - 提取直方图 R 后面的数字
- node.js - 如何在 azure devops 管道中的 docker 映像中嵌入环境变量?
- c# - Azure 上托管的 ASP.NET Core Web API 不发送电子邮件
- sql - 检查查询的执行时间精确到微秒
- node.js - Google App Engine 上的 NestJS 项目显示错误“无法写入文件”
- python - Excel 工作表在通过脚本后被标记为组