Блау индекс разнообразия в R
Я пытаюсь вычислить индекс разнообразия Блау (Джини-Симпсона) в R на моем фрейме данных. У меня есть 6 столбцов для каждого человека в группе со значениями от "Студент", "Факультет", "Выпускник", "Не применимо". Есть также NA внутри столбцов, если группа меньше 6.
Я хотел бы рассчитать индекс Блау по строкам (разнообразие по всей группе), а не по каждому столбцу, с na.rm= TRUE.
Кто-нибудь знает, как это сделать в R?
Спасибо!
1 ответ
Мы можем довольно легко вычислить индекс Джини-Симпсона вручную.
Прежде всего, я сгенерирую некоторые примеры данных:
# Generate sample data
set.seed(2017);
type <- c("Student", "Faculty", "Alumni");
data <- sample(type, 6 * 20, replace = TRUE);
# Replace 40 entries with NAs
set.seed(2017);
data[sample(6 * 20, 40)] <- NA;
# Reformat as 6 column dataframe
df <- as.data.frame(matrix(data, ncol = 6), stringsAsFactors = FALSE);
names(df) <- paste0("e", seq(1:6), "_affiliation");
head(df);
#e1_affiliation e2_affiliation e3_affiliation e4_affiliation e5_affiliation
#1 <NA> Faculty <NA> Student Student
#2 <NA> <NA> <NA> Faculty Alumni
#3 <NA> Alumni Student Faculty Faculty
#4 Student <NA> <NA> <NA> <NA>
#5 <NA> Student Alumni Alumni Student
#6 Alumni Alumni Faculty Faculty Student
# e6_affiliation
#1 Alumni
#2 Alumni
#3 <NA>
#4 Student
#5 Faculty
#6 Student
Индекс разнообразия Джини-Симпсона (= Гиббса-Мартина = Блау) определяется выражением
где R обозначает общее количество типов, и пропорциональная численность i- го типа.
Мы определяем функцию, которая принимает вектор строк и возвращает индекс GS:
# Define function to calculate the Gini-Simpson index
# We ensure the same levels (present or absent) of x
# by factor(x, levels = type)
# Note that NAs will not be considered by default
get.GS.index <- function(x, type) {
x <- factor(x, levels = type);
return(1 - sum(prop.table(table(x))^2));
}
Теперь мы можем подать заявку get.GS.index
ко всем строкам информационного кадра
apply(df, 1, get.GS.index, type)
#[1] 0.6250000 0.4444444 0.6250000 0.0000000 0.6400000 0.6666667 0.5000000
#[8] 0.6250000 0.6400000 0.5000000 0.4444444 0.6400000 0.3750000 0.3750000
#[15] 0.0000000 0.0000000 0.6111111 0.4444444 0.6666667 0.6400000
Обновить
Мы можем изменить функцию get.GS.index
возвращать NA
если в группе присутствует только один тип.
get.GS.index <- function(x, type) {
x <- factor(x, levels = type);
t <- table(x);
if (length(t[t>0]) == 1) return(NA) else return(1 - sum(prop.table(t)^2));
}
apply(df, 1, get.GS.index, type);
# [1] 0.6250000 0.4444444 0.6250000 NA 0.6400000 0.6666667 0.5000000
# [8] 0.6250000 0.6400000 0.5000000 0.4444444 0.6400000 0.3750000 0.3750000
#[15] NA NA 0.6111111 0.4444444 0.6666667 0.6400000