减少样本的大数据帧,以确保样本之间的最大差异

问题描述

我有一个向量列表,列表中的每个条目都是索引的向量,例如:

list(c(563L,688L,630L,160L,568L,908L,457L,798L,3L,558L,56L,389L,506L,106L,807L,556L,809L,63L,343L,242L,470L,894L,804L,970L,406L,881L,893L,952L,126L,827L,282L,910L,61L,66L,763L,787L,337L,41L,712L,144L,450L,12L,200L,574L,945L,236L,336L,684L,280L,721L,233L,686L,64L,504L,174L,934L,40L,850L,26L,799L,853L,978L),c(85L,564L,591L,662L,377L,536L,325L,402L,72L,410L,687L,216L,603L,67L,794L,388L,627L,376L,863L,491L,598L,861L,991L,651L,670L,401L,459L,39L,997L,806L,623L,954L),c(427L,791L,212L,779L,657L,740L,800L,838L,104L,985L,167L,486L,685L,739L,60L,862L,130L,134L,175L,375L,683L,885L,575L,859L,341L,726L,472L,802L,76L,424L,177L,624L,189L,334L,378L,329L,581L,224L,851L,218L,993L,678L,248L,365L,188L,774L,58L,813L,514L,59L,777L,485L,606L,480L,826L,350L,608L,27L,661L,775L,340L,10L,207L,260L,483L,150L,205L),c(138L,587L,165L,1L,722L,300L,500L,535L,832L,392L,432L,139L,744L,676L,839L,107L,769L,589L,647L,548L,704L,197L,689L,111L,342L,319L,567L,17L,925L,5L,116L,493L,241L,965L
),c(89L,440L,228L,884L,88L,147L,413L,821L,70L,95L,71L,917L,463L,990L,672L,981L,765L,937L,75L,766L,374L,636L,449L,816L,1000L,356L,629L),c(421L,650L,453L,666L,584L,717L,220L,605L,182L,811L,157L,523L,28L,527L,737L,812L,263L,675L,132L,879L,438L,451L,883L,950L,114L,466L,348L,711L,209L,887L,593L,949L,349L,764L,595L,736L,660L,801L,118L,877L),c(23L,231L,78L,988L,55L,57L,753L,994L,437L,202L,842L,190L,822L,968L,331L,733L,782L,886L,105L,943L,743L,815L,311L,498L,792L,795L,184L,728L,573L,771L,117L,251L,192L,735L,15L,776L,295L,677L,631L,235L,237L,705L,856L,97L,725L),c(229L,671L,129L,405L,115L,644L,98L,492L,871L,935L,435L,707L,773L,754L,803L,120L,656L,345L,875L,330L,533L,366L,240L,408L,332L,577L,550L,452L,963L,8L,187L,226L,901L,371L,426L,339L,519L,86L,501L,274L,831L),c(16L,79L,68L,477L,133L,659L,2L,973L,264L,953L,90L,234L,420L,588L,21L,788L,363L,539L,227L,565L,30L,642L,786L,982L,347L,680L,52L,96L,592L,409L,643L,81L,419L,245L,658L,416L,590L,448L,819L,277L,357L,442L,789L,516L,980L,93L,998L,149L,166L,299L,454L,529L,986L,127L,541L,45L,829L,289L,418L,179L,310L,113L,729L),c(429L,781L,303L,434L,83L,259L,387L,583L,393L,770L,246L,428L,947L,976L,31L,382L,710L,944L,164L,868L,373L,899L,74L,468L,614L,701L,221L,645L,268L,785L,293L,632L,24L,749L,283L,741L,796L,915L),c(258L,844L,649L,752L,474L,613L,351L,551L,309L,380L,497L,724L,327L,992L,845L,607L,818L,693L,914L,291L,720L,633L,974L,367L,639L,94L,467L,92L,522L,141L,496L,276L,542L,665L,695L,634L,602L,913L,396L,597L,443L,892L,65L,394L,222L,778L,169L,960L,35L,655L,422L,927L,154L,215L,262L,203L,880L,217L,423L,755L,904L,180L,620L),c(507L,628L,29L,902L,738L,897L,664L,967L,294L,682L,254L,302L,128L,559L,511L,526L,7L,742L,464L,621L,265L,599L,102L,546L,458L,969L,751L,860L,326L,873L,335L,580L,499L,962L,290L,557L,213L,716L,53L,835L,600L,610L,321L,673L,713L,876L,244L,462L,136L,272L,195L,447L,230L,679L,465L,611L,297L,731L,44L,824L,162L,837L),c(446L,561L,391L,652L,857L,946L,560L,784L,854L,204L,512L,82L,455L,372L,407L,328L,808L,152L,178L,185L,543L,108L,473L,490L,955L,719L,757L,198L,338L,223L,919L,531L,653L,734L,923L,487L,637L,398L,431L,46L,848L,324L,948L,43L,183L,288L,697L,87L,307L,42L,571L,360L,433L,390L,569L,956L,534L,6L,381L,549L,301L,920L,69L,322L,267L,503L,285L,961L,370L,425L),c(344L,959L,364L,552L,11L,481L,287L,891L,692L,762L,47L,292L,358L,810L,942L,730L,746L,638L,750L,759L,761L,140L,444L,191L,805L,306L,691L,170L,715L,508L,984L,461L,911L,103L,938L,718L,928L),c(124L,284L,123L,513L,417L,933L,121L,168L,208L,385L,32L,273L,869L,932L,397L,509L,239L,797L,379L,723L,898L,163L,320L,833L,151L,906L,648L,732L,279L,834L,489L,840L,783L,971L,49L,145L,253L,352L,137L,261L,247L,143L,544L,109L,921L,830L,972L,585L,690L,609L,703L,250L,708L,225L,889L,181L,987L,54L,502L,148L,355L,888L,579L,983L,825L,855L,62L,918L,979L,586L,681L,384L,709L,333L,758L,194L,368L),c(646L,930L,361L,399L,13L,298L,395L,975L,482L,940L,596L,772L,700L,843L,171L,537L,173L,836L,767L,989L,532L,890L,99L,865L,142L,135L,271L,346L,441L,48L,941L,866L,201L,872L,36L,520L,530L,77L,270L),c(238L,699L,22L,50L,615L,702L,4L,469L,101L,314L,616L,995L,996L,414L,566L,249L,572L,369L,553L,158L,159L,199L,317L,515L,517L,524L,562L,19L,476L,20L,146L,618L,895L,312L,912L),c(768L,939L,578L,849L,196L,640L,323L,635L,304L,318L,874L,977L,488L,619L,155L,905L,9L,112L,484L,847L,313L,900L,494L,727L,625L,931L,119L,846L,186L,219L,471L,696L,404L,460L,668L,896L,439L,964L,275L,756L,411L,878L,538L,669L,478L,570L,255L,547L,257L,841L,37L,576L,456L,663L,525L,817L,612L,820L
),c(243L,594L,33L,176L,415L,667L,748L,852L,232L,922L,308L,436L,153L,505L,14L,281L,316L,495L,540L,622L,156L,926L,521L,698L,545L,760L,84L,210L,359L,131L,745L,34L,91L,555L,858L,445L,867L,125L,814L,604L,706L,315L,654L,747L,936L,269L,957L),c(80L,924L,110L,193L,958L,296L,475L,18L,907L,626L,999L,278L,362L,51L,641L,211L,929L,122L,694L,73L,353L,25L,100L,305L,864L,214L,790L,286L,518L,674L,206L,400L,554L,903L,780L,916L,38L,430L,617L,823L,172L,966L,412L,951L,510L,828L,479L,909L,266L,582L,870L,882L,161L,252L,256L,383L,403L,601L,386L,793L,528L,354L,714L))

其中每个条目(或每个嵌套列表)代表使用聚类方法获得的组。

现在,我有以下代码片段,它使用此嵌套列表列表和所需的样本量,并返回一个数据帧,其中每一行代表一个样本,而每一列则是其中一个样本组中的单个样本嵌套列表。

groups_samples <- function(groups,repetition) {
  return(as.data.frame(sapply(groups,sample,repetition,TRUE)))
}

让我们以以下示例为例:

df <- groups_samples(ll,100)

    structure(list(V1 = c(106L,978L,910L),V2 = c(72L,954L,85L,459L),V3 = c(424L,205L,427L,340L),V4 = c(138L,965L,138L,111L
),V5 = c(816L,89L,629L,440L),V6 = c(650L,877L,421L,950L),V7 = c(994L,725L,23L,192L),V8 = c(754L,229L,435L
),V9 = c(643L,16L,729L,234L),V10 = c(31L,915L,429L,382L),V11 = c(351L,258L,620L,215L),V12 = c(102L,837L,507L,742L
),V13 = c(108L,446L,425L,637L),V14 = c(746L,928L,344L,191L),V15 = c(987L,124L,368L,124L),V16 = c(346L,646L,270L,532L
),V17 = c(912L,912L,238L,572L),V18 = c(525L,768L,820L,619L),V19 = c(926L,957L,243L,540L),V20 = c(554L,80L,714L,122L)),class = "data.frame",row.names = c(NA,-100L))

现在我想做的就是减少数量,比如说从100个减少到50个,其中每个条目都是每个组中两个索引为1的索引。我尝试使用几种方法来计算距离矩阵,并选择距离最远的条目,但是当我检查时它并没有那么丰富。

有没有办法做到这一点,也许可以考虑列表列表或其他复杂的方法

希望获得一些帮助/见解

编辑-阐明目标

假设我对100个组进行了采样,其中每个组从嵌套列表的每个列表中包含1个元素。

其中一些组彼此接近,假设两个组之间只有1个元素不同,所以我可能会希望将其丢弃。或什至只有两个元素是不同的,等等。但是我希望最终保留 K 组,它们尽可能“遥远”。

如果可以考虑的是特定嵌套列表中元素的数量以及某种加权过程,那也很好。

编辑2号

对于以下list(c(1L,6L),c(3L,9L),c(8L,10L)) ,我们得到以下数据帧:

structure(list(V1 = c(1L,1L),V2 = c(9L,3L
),V3 = c(7L,10L)),-100L))

运行@Allan Cameron代码,将生成以下5个更好的代码

   V1 V2 V3
26  1  2  7
68  6  9 10
7   1  3  7
17  5  9 10
13  1  3  7

解决方法

正如您所描述的,两组之间的总体“距离”概念有些模糊。显然,像c(1,5,2,6)c(2,9,12,3)这样的对比c(1,6)c(101,78,96,54)对更近,但是精确匹配是否应该受到惩罚?差异重要吗?在没有更清晰的距离概念的情况下,我们拥有的最佳度量是每个组的 mean 。这很容易通过rowMeans(df)获得。

K 最远的群体”的概念也有些含糊。组之间的距离是组的函数,而不是单个组的函数。如果 K = 1,则任何组都可以。如果 K = 2,则您希望单组之间的均值差异最大。此后,您不清楚要寻找什么,但是一种方法是找到方差最大的 K 个组。

所以,如果我们做类似的事情:

k <- 5

group_means <- rowMeans(df)
indices     <- seq(nrow(df))

k_furthest <- c(which.min(group_means),which.max(group_means))
k_vals     <- c(min(group_means),max(group_means))

group_means <- group_means[-k_furthest]
indices     <- indices[-k_furthest]

while(length(k_furthest) < k)
{
  best <- which.max(rowSums(sapply(k_vals,function(x) (x - group_means)^2)))
  k_vals <- c(k_vals,group_means[best])
  k_furthest <- c(k_furthest,indices[best])
  group_means <- group_means[-best]
  indices     <- indices[-best]
}

然后k_furthest将包含数据帧的5行集合,所有均值之间的方差最大。您的结果将如下所示:

 df[k_furthest,]
#>     V1  V2  V3  V4   V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
#> 63 236 794 885 300   71 114 725 492  52 468  92 128 948 191 585 441 414 196 156  18
#> 51 798 536 739 704 1000 883 237 644 299 915 695 860 338  47 972 890 996 939 957 793
#> 61  41 388 624 689  672 466  55 229 454 164 542 265 338 170  32 271 314 640 922 582
#> 33 970 598 775 548  228 132 842 644 986 781 818 679 920 287 825 361 562 756 748 929
#> 12 336 216 774 107   71 801 725 492 642  74 613 297 948 306 124 646  19 439 281 122

请注意,尽管该算法实际上只是在每次迭代中交替采用具有最高和最低均值的行。尽管这会在样本之间产生最大的总体“差异”,但是如果两个样本之间的距离也与另一个样本相距很远,您可能最终会获得一些非常接近的样本。这可能不是您要寻找的,这就是为什么在这种情况下准确指定“距离”是个好主意的原因。

编辑

通过进一步的说明和OP中的新示例,似乎我们正在寻求最大程度地提高组之间元素方面的差异之和。这意味着我们可以做到:

distances <- as.data.frame(t(sapply(1:nrow(df),function(i) {
  a <- rowSums(apply(df,function(x) abs(x[i] - x)))
  c(row = i,most_distant = which.max(a),difference = max(a))
  })))

这将为我们提供一个数据框,每一行告诉我们最“遥远”的另一组。

head(distances)
#>   row most_distant difference
#> 1   1           16         15
#> 2   2           46         13
#> 3   3            9         14
#> 4   4           68         12
#> 5   5           46         15
#> 6   6           68         13

如果我们根据最大的差异对它进行排序,并采用前两列中提到的前 K 组,我们将得到结果:

i <- unique(c(t(distances[order(-distances$difference)[seq(k)],1:2])))[seq(k)]

df[i,]
#>    V1 V2 V3
#> 1   1  9  7
#> 16  6  2 10
#> 5   6  2  7
#> 46  1  9 10
#> 26  1  2  7