Разделите набор данных на два кластера с равной общей дисперсией.

У меня есть набор данных, который состоит из ряда элементов, разделенных на две отдельные категории (с равным количеством элементов для каждой категории), и с двумя непрерывными переменными, описывающими их, например:

ID  |  Category  |  Variable_1  |  Variable_2
--------------------------------------------
1   |  Triangle  |  4.3522      |  5.2321
2   |  Triangle  |  3.6423      |  6.3223
3   |  Circle    |  5.2331      |  3.2452
4   |  Circle    |  2.6334      |  7.3443
... |  ...       |  ...         |  ...

Теперь я хотел бы разделить свой набор данных на два новых набора, которые максимально соответствуют тому, где находится среднее значение отдельных наборов в 2D-пространстве, которое определяется Variable_1 и Variable_2. То есть расстояние между двумя наборами должно быть максимально близким.

Кроме того, если возможно (поскольку я понимаю, что это может значительно усложнить решение проблемы), я хотел бы, чтобы дисперсии в двух наборах совпадали как можно ближе, где мы, например, можем определить дисперсию целого устанавливается как сумма дисперсий каждой переменной. Здесь я думаю, что вы просто добавляете еще одно измерение в свое пространство для дисперсии и пытаетесь найти лучшее решение для всего трехмерного пространства, которое состоит из двух переменных и дисперсии.

Как я могу добиться этого в R?


person Speldosa    schedule 29.10.2014    source источник
comment
Похоже, вам действительно нужна кластеризация. Конкретно на 2 кластера. Но ваша метрика равных общих отклонений нестандартна. См. en.wikipedia.org/wiki/K-means_clustering.   -  person smci    schedule 30.10.2014
comment
@speldosa С уважением, я думаю, что в этом случае k-means не сработает. Два центроида фактически будут средними для двух выборок, и они, очевидно, не могут быть одинаковыми, потому что в противном случае у нас не было бы двух кластеров. Центроиды лучше всего, если они находятся как можно дальше друг от друга. Вы также можете проверить здесь. P.S. Я всегда открыт для обсуждения :)   -  person LyzandeR    schedule 30.10.2014
comment
@smci Извините, это сообщение было адресовано вам, а не спелдоса :). Прости за это.   -  person LyzandeR    schedule 30.10.2014
comment
Я специально сказал, что K-means - это не тот тип кластеризации, который хочет OP, я просто пытался указать им на словарь, чтобы помочь им сформулировать то, что они делают. (Хотят ли они разделиться на 2 кластера и эвристически перемещать центроид до тех пор, пока общая дисперсия не станет примерно равной ?? или что?)   -  person smci    schedule 30.10.2014


Ответы (1)


Я бы попытался подойти к этой проблеме (как вы упомянули выше), чтобы заботиться о расстоянии между переменной1 и переменной2. Поэтому я бы создал новое поле с именем distance (ниже я назвал его diff), которое будет вычисляться как переменная1-переменная2. Затем я бы заказал фрейм данных по этому столбцу и разделил фрейм данных строка за строкой, т.е. каждая нечетная строка перешла бы в pot1, а каждая четная строка - в pot2. Это демонстрируется на примере следующего кода:

id<-1:2000
a<-runif(2000,-100,100)
b<-runif(2000,-200,200)
mydf <- data.frame(id,a,b)

mydf['diff'] <- mydf[['a']] - mydf[['b']]
mydf<-mydf[with(mydf, order(diff)), ]

head(mydf,20) 

выход:

> head(mydf,20) #as you can see the dataframe is ordered by diff (ascending)
       id         a        b      diff
1732 1732 -95.96522 198.1666 -294.1318
187   187 -94.24905 196.9341 -291.1831
338   338 -95.31069 194.9997 -290.3104
231   231 -91.98249 194.0672 -286.0497
1513 1513 -97.01006 183.5874 -280.5974
715   715 -94.53303 185.1026 -279.6356
145   145 -99.73511 178.2460 -277.9811
979   979 -87.73586 190.0489 -277.7848
1165 1165 -85.53447 187.6254 -273.1598
1243 1243 -94.75502 176.8572 -271.6122
1208 1208 -77.32021 189.1589 -266.4791
1826 1826 -92.23949 171.6341 -263.8736
167   167 -98.84123 163.6960 -262.5372
1283 1283 -76.54766 185.8721 -262.4197
1391 1391 -72.04732 189.9422 -261.9896
322   322 -77.53867 183.4744 -261.0131
75     75 -88.04799 171.9066 -259.9546
882   882 -65.11661 193.8533 -258.9699
1119 1119 -77.59978 181.2392 -258.8390
1624 1624 -81.81879 175.9795 -257.7983

а теперь разделим фрейм данных:

samplea_1<-NULL
samplea_2<-NULL
sampleb_1<-NULL
sampleb_2<-NULL
id_1<-NULL
id_2<-NULL
diff_1<-NULL
diff_2<-NULL
for ( i in 1:nrow(mydf) ) {
  if(i%%2==0) {
    samplea_1 <- append(samplea_1,mydf$a[i])
    sampleb_1 <- append(sampleb_1,mydf$b[i])
    id_1      <- append(id_1,mydf$id[i])
    diff_1    <- append(diff_1,mydf$diff[i])
  } else {
    samplea_2 <- append(samplea_2,mydf$a[i])
    sampleb_2 <- append(sampleb_2,mydf$b[i])
    id_2      <- append(id_2,mydf$id[i])
    diff_2    <- append(diff_2,mydf$diff[i])
  }
}

sample1<-data.frame(samplea_1,sampleb_1,id_1,diff_1)
sample2<-data.frame(samplea_2,sampleb_2,id_2,diff_2)
summary(sample1)
summary(sample2)

выход:

> summary(sample1)
   samplea_1          sampleb_1             id_1            diff_1        
 Min.   :-99.2058   Min.   :-199.519   Min.   :   1.0   Min.   :-291.183  
 1st Qu.:-47.5615   1st Qu.:-100.917   1st Qu.: 495.8   1st Qu.:-105.851  
 Median :  1.3997   Median :   7.004   Median : 980.5   Median :  -1.333  
 Mean   :  0.7047   Mean   :   2.044   Mean   : 991.0   Mean   :  -1.340  
 3rd Qu.: 50.4087   3rd Qu.: 101.678   3rd Qu.:1482.8   3rd Qu.:  99.381  
 Max.   : 99.8470   Max.   : 199.833   Max.   :2000.0   Max.   : 291.797  
> summary(sample2)
   samplea_2          sampleb_2              id_2            diff_2        
 Min.   :-99.7351   Min.   :-199.9494   Min.   :   2.0   Min.   :-294.132  
 1st Qu.:-48.4339   1st Qu.: -99.7880   1st Qu.: 509.8   1st Qu.:-106.338  
 Median : -1.4627   Median :   6.8745   Median :1024.0   Median :  -1.425  
 Mean   : -0.7104   Mean   :   0.9099   Mean   :1010.0   Mean   :  -1.620  
 3rd Qu.: 48.1663   3rd Qu.:  94.7360   3rd Qu.:1513.2   3rd Qu.:  99.334  
 Max.   : 99.9496   Max.   : 199.8544   Max.   :1996.0   Max.   : 288.840 

Как вы можете видеть, столбцы diff имеют почти одинаковое среднее значение, которое немного интуитивно понятно, потому что мы упорядочили фрейм данных в соответствии с этим столбцом, но, как вы можете видеть, то же самое примерно одинаково для столбцов samplea и sampleb! Это происходит потому, что разница получается из a и b, но результаты будут менее точными в зависимости от того, насколько высока дисперсия для каждого отдельного столбца a и b.

Надеюсь, это поможет!

person LyzandeR    schedule 29.10.2014
comment
Это, вероятно, подойдет в качестве резервного решения, если я не буду придумывать ничего другого. Спасибо! - person Speldosa; 07.01.2015
comment
Прохладный! Рад помочь :) - person LyzandeR; 07.01.2015