2

我正在为线性回归模型执行 Box-Cox 转换,但在R.

我已经获得了 Box-Cox 的最佳 lambda 值。我正在尝试执行以下操作R

opt.lambda.test<- lapply(temp.list, function(x) with(x, x[which.max(y)]))

从 Box-Cox 中提取最佳 lambda。temp.list是回归结果列表。

opt.lambda.test
[[1]]
[1] 0.77

[[2]]
[1] 3.46

然后我把它变成一个向量:

vec.lambda <- unlist(opt.lambda.test)

我有一个数据框,在这个例子中,有 2 列。这是一个片段:

       x_1       x_2
[1,]  99.81974  99.43289
[2,] 102.20328 103.68653
....

完整的数据框只是:

 x_1 <- rnorm(100,mean=100,sd=1)
 x_2 <- rnorm(100,mean=100,sd=4)
 x.temp1<-cbind(x_1,x_2)

在我正在分析的实际数据中,列的行数不会相同。

任何人,我希望数据框的每一列都被提升到vec.lambda. 在这种情况下,x_1$^{0.77}$ 和x_2$^{3.46}$ 等等。的长度vec.lamba将始终等于数据帧的列数。

但是,如果vec.lambda == 0我希望将列转换为:$log(x_{i})$。我无法让第一部分工作,所以我希望在这个数据框操作的条件方面和普通的旧数据框操作方面得到一些帮助。

x.test.1 <- apply(x.temp1,2,function(x) x^vec.lambda)

是我幼稚的尝试没有奏效吗?

4

1 回答 1

1

您将函数应用于每一列而不是每一行。如果您将 更改2为 a 1,您将几乎拥有您想要的;你实际上有你想要的转置(因为apply会将每个结果放在一列中),但是转置结果很容易:

t(apply(x.temp1,1,function(x) x^vec.lambda))

但是,还有其他方法可能更快。R 将沿列然后跨列回收值,因此您可以转置矩阵(以便一列有两行),将其提升到vec.lambda(这将针对每一列自动重复),然后转置结果:

t(t(x.temp1) ^ vec.lambda)

您还可以创建一个与此长度相同的向量,x.temp1然后将其提高x.temp1到:

x.temp1 ^ rep(vec.lambda, each=nrow(x.temp1))

甚至是与 相同尺寸的矩阵x.temp1,因此x.temp1[i, j]应该提高到mat.lambda[i, j]。也许这是最清晰的方法:

mat.lambda <- matrix(vec.lambda, ncol=2, nrow=nrow(x.temp1), byrow=TRUE)
x.temp1 ^ mat.lambda

至于您希望在vec.lambda为零时执行不同的操作,一种方法是使用ifelse

mat.lambda <- matrix(vec.lambda, ncol=2, nrow=nrow(x.temp1), byrow=TRUE)
ifelse(mat.lambda==0, log(x.temp1), x.temp1 ^ mat.lambda)
于 2013-09-25T19:30:15.740 回答