这是一个例子。我有3个变量(实际上是10.000),我只是通过对这些变量的平均值来创建一个新变量。例如,只是变量x1和x3(在示例中)。
输出是创建一个矩阵,其结果是在变量和新变量之间使用损失度量。正如您在示例中看到的那样。我想概括一下这个例子,其中新变量不仅仅是2或3个变量的平均值,它可以是5.000变量,然后进行结果计算
我将不胜感激的任何帮助。
x<-data.frame(x1= runif(10,min = 0,max = 2000), x2=runif(10,min = 0,max = 1000), x3= runif(10,min = 0,max = 14000))
y1<- rowMeans(x[,c("x1","x2")])
y2<- rowMeans(x[,c("x1","x3")])
y3<- rowMeans(x)
results<-cbind(0.5*abs(x$x1-y1)+0.5*abs(x$x2-y1),
0.5*abs(x$x1-y2)+0.5*abs(x$x3-y2),
0.33*abs(x$x1-y3)+0.33*abs(x$x3-y3)+0.34*abs(x$x2-y3))
更新:
实际上意味着人们可以留下不止一列。不只是一个。但也是使用所有列的情况。
答案 0 :(得分:1)
这可以通过以下方式更有效地完成:
cbind(
rowMeans( abs( x[-3] - rowMeans(x[-3]) ) ),
rowMeans( abs( x[-2] - rowMeans(x[-2]) ) ),
rowMeans( abs( x - rowMeans(x) ) )
)
它并不准确,因为最后一栏实际上是:
(1/3)*abs(x$x1-y3)+(1/3)*abs(x$x3-y3)+(1/3)*abs(x$x2-y3))
此函数将在留一法(任意数量的列基础:
)上返回该指标L1.leaveout <- function(dfrm,cidx) rowMeans( abs(dfrm[-cidx] - rowMeans(dfrm[-cidx])))
对于您提供的特定示例,它可以以您这种方式请求的形式进行部署:
do.call( cbind, c( lapply(2:length(x), #leave out each singly except first
function(z) L1.leaveout(x, z) ),
list(rowMeans( abs( x-rowMeans(x) ) )) # last column
)
)