我正在构建(我想是)一个简单的循环,该循环构建boxcox参数(lambda和shift)的数据框。该代码似乎可以正常工作,但是当我想将其转换为函数时,我注意到R正在复制我的输出值。
下面的可复制代码,希望有更多知识的人可以解释这种非常混乱的行为。
#Just running the code
library(MASS)
x <- iris[,-5]
bc_ref <- data.frame(var = character(),
pwr = numeric(),
shift = numeric())
for(i in 1:ncol(x)){
tmp <- x[,i]
orig <- colnames(x)[i]
if(min(tmp) < 0){
tmp <- tmp + abs(min(tmp)*1.1)
shift <- abs(min(tmp))
}
bcMod <- boxcox(lm(as.matrix(tmp)~1),
lambda = seq(-2.01, 2.01, 1/10),
plotit = F)
lambda <- bcMod$x[which.max(bcMod$y)]
if(lambda == 0){
stop("Error, lambda is 0")
}
bc_row <- data.frame(var = paste0("bc.",orig),
pwr = signif(lambda),
shift = ifelse(
exists("shift"),
shift,
NA))
bc_ref <- rbind(bc_ref, bc_row)
if(exists("shift")){
rm(shift)
}
} #End loop
#bc_ref
var pwr shift
1 bc.Sepal.Length -0.11 NA
2 bc.Sepal.Width 0.29 NA
3 bc.Petal.Length 0.89 NA
4 bc.Petal.Width 0.69 NA
以上是该函数的工作方式,下面显示了与函数完全相同的代码。突然输出改变了!
bc_ref $ pwr中的最后一个值重复。为什么只有那一列?我真的很难理解为什么会这样。
fxn <- function(x){
bc_ref <- data.frame(var = character(),
pwr = numeric(),
shift = numeric())
for(i in 1:ncol(x)){
tmp <- x[,i]
orig <- colnames(x)[i]
if(min(tmp) < 0){
tmp <- tmp + abs(min(tmp)*1.1)
shift <- abs(min(tmp))
}
bcMod <- boxcox(lm(as.matrix(tmp)~1),
lambda = seq(-2.01, 2.01, 1/10),
plotit = F)
lambda <- bcMod$x[which.max(bcMod$y)]
if(lambda == 0){
stop("Error, lambda is 0")
}
bc_row <- data.frame(var = paste0("bc.",orig),
pwr = signif(lambda),
shift = ifelse(
exists("shift"),
shift,
NA))
bc_ref <- rbind(bc_ref, bc_row)
if(exists("shift")){
rm(shift)
}
} #End loop
return(bc_ref)
}
#fxn(x)
var pwr shift
1 bc.Sepal.Length 0.69 NA
2 bc.Sepal.Width 0.69 NA
3 bc.Petal.Length 0.69 NA
4 bc.Petal.Width 0.69 NA
谢谢您的时间!
答案 0 :(得分:0)
我不知道为什么,但是解决方案是更改此内容:
lm(as.matrix(tmp)~1)
对此
tmp~1