2015-03-20 3 views
1

Мои вопросы касаются расчета Cramers V для определения корреляции между категориальными переменными. У меня есть набор данных с отсутствующими значениями, но я создал поддельный набор данных для иллюстрации с двумя переменными a и b, один из которых содержит NA.Cramer's V с недостающими значениями дает разные результаты

a <- factor(c("M","","F","F","","M","F","F")) 
a2 <- factor(a, levels = c('M','F'),labels =c('Male','Female')) 
b <- factor(c("y","y","","y","n","n","n","y")) 
b2 <- factor(b, levels=c("y","n"),labels=c("yes","no")) 
df<-cbind(a2,b2) 

Функция assocstats дает мне результат для cramers V:

require(vcd) 
> tab <-table(a,b) 
> assocstats(tab) 
          X^2 df P(> X^2) 
Likelihood Ratio 1.7261 4 0.78597 
Pearson   1.3333 4 0.85570 

Phi-Coefficient : 0.408 
Contingency Coeff.: 0.378 
Cramer's V  : 0.289 

Теперь я хочу отказаться от НС от уровней

a[a==""]<-NA 
    a3 <- droplevels(a) 
    levels(a3) 

    tab <-table(a,b) 
    assocstats(tab) 

Но каждый раз, когда я удалить НС результат выглядит следующим образом:

    X^2 df P(> X^2) 
Likelihood Ratio 0.13844 2 0.93312 
Pearson    NaN 2  NaN 

Phi-Coefficient : NaN 
Contingency Coeff.: NaN 
Cramer's V  : NaN 

Кроме того, поскольку у меня есть большой набор данных, я хотел бы вычислить матрицу результатов Cramer V. Я нашел этот код здесь на переполнение стека и, кажется, работает ...

get.V<-function(y){ 
    col.y<-ncol(y) 
    V<-matrix(ncol=col.y,nrow=col.y) 
    for(i in 1:col.y){ 
    for(j in 1:col.y){ 
     V[i,j]<-assocstats(table(y[,i],y[,j]))$cramer 
    } 
    } 
    return(V) 
} 

    get.V(tab) 

Только что результат отличается, чем с функцией assocstats:

[,1] [,2] [,3] 
[1,] 1.0 0.5 1 
[2,] 0.5 1.0 1 
[3,] 1.0 1.0 1 

Это не может быть правдой, потому что я получать этот результат каждый раз, даже если менять количество наблюдений ... что не так с этим кодом?

Заключение: Я не знаю, какой из результатов является правильным. У меня большой набор данных, в котором много НС. Первый результат asocstat и код дают разные результаты, хотя нет большой разницы, потому что код создает только матрицу. Вторая функция asocstat дает только NaN.I не могу обнаружить никаких ошибок ... Может ли кто-нибудь мне помочь?

+0

так вы не определяете '' '' как уровень в a2 и b2, а не то, что вы хотите (т. е. вам не нужно создавать a3: 'a [a ==" "] <- NA; a3 <- капли (a) ')? когда вы делаете таблицу, вы должны явно использовать 'table (..., useNA = 'ifany')', чтобы сохранить NA, поэтому вы уже их исключаете. Поэтому 'assocstats (table (a2, b2))' должен работать – rawr

+0

В моем наборе данных у меня есть уровень "", и я должен удалить их с помощью капель, поэтому я создал этот набор данных таким образом, я не хочу поддерживать НС.И я не понимаю, почему функция asocstats создает NaN при их удалении. – Charlotte

+0

Я думаю, что вы получили NaN, вы удалили их в a и сбросили уровни для a3, но вы не сделали то же самое для b – rawr

ответ

0

Вы не должны заменить "" с NA, если вы используете факторы - любое уникальное значение, которое вы не определили в levels будут преобразованы в NA по factor

a <- factor(c("M","","F","F","","M","F","F")) 
a2 <- factor(a, levels = c('M','F'),labels =c('Male','Female')) 

a 
# [1] M F F M F F 
# Levels: F M 
a2 
# [1] Male <NA> Female Female <NA> Male Female Female 
# Levels: Male Female 

b <- factor(c("y","y","","y","n","n","n","y")) 
b2 <- factor(b, levels=c("y","n"),labels=c("yes","no")) 


(df <- cbind(a2,b2)) 

#  a2 b2 
# [1,] 1 1 
# [2,] NA 1 
# [3,] 2 NA 
# [4,] 2 1 
# [5,] NA 2 
# [6,] 1 2 
# [7,] 2 2 
# [8,] 2 1 

выше, вы создавая матрицу, которая теряет все метки, созданные с помощью factor. Я думаю, что вы хотите кадр данных:

(df <- data.frame(a2,b2)) 

#  a2 b2 
# 1 Male yes 
# 2 <NA> yes 
# 3 Female <NA> 
# 4 Female yes 
# 5 <NA> no 
# 6 Male no 
# 7 Female no 
# 8 Female yes 


require('vcd') 
(tab <- table(a2,b2, useNA = 'ifany')) 
#   b2 
# a2  yes no <NA> 
# Male  1 1 0 
# Female 2 1 1 
# <NA>  1 1 0 

(tab <- table(a2,b2)) 
#   b2 
# a2  yes no 
# Male  1 1 
# Female 2 1 

Вам нужно явно указать table, если вы хотите увидеть NA значения в таблице. В противном случае, он будет падать их по умолчанию, так что вы уже «за исключением» их, когда вы используете assocstats:

assocstats(tab) 

#      X^2 df P(> X^2) 
# Likelihood Ratio 0.13844 1 0.70983 
# Pearson   0.13889 1 0.70939 
# 
# Phi-Coefficient : 0.167 
# Contingency Coeff.: 0.164 
# Cramer's V  : 0.167 

Для get.V просто передать кадр данных или матрицу, а не таблица:

get.V <- function(y) { 
    col.y <- ncol(y) 
    V <- matrix(ncol=col.y,nrow=col.y) 
    for(i in 1:col.y){ 
    for(j in 1:col.y){ 
     V[i,j] <- assocstats(table(y[,i],y[,j]))$cramer 
    } 
    } 
    return(V) 
} 


get.V(df) 

#   [,1]  [,2] 
# [1,] 1.0000000 0.1666667 
# [2,] 0.1666667 1.0000000 
+0

ОК спасибо! Кажется, я нашел ошибку. Я хочу удалить '' '' из переменной, и я делаю 'var [var ==" "] <- NA var <- droplevels (var)' , тогда я хочу выбрать dataframe с переменными categy, которые я преобразовал без пустые уровни: 'cat <-subset (data, select = c (var, var1, var2)) ' b <-table (var, var1) assocstats (b)', но этот dataframe по-прежнему содержит переменные с пустые уровни! Что я могу сделать, чтобы заменить их в dataframe с помощью преобразованных переменных? – Charlotte

+0

вы можете сделать весь кадр данных сразу: 'data [data == ''] <- NA' – rawr

+0

Для матрицы вывода функции get.V, существует ли способ замены столбцов и номеров строк матрицы на исходные имена столбцов и строк из фрейма данных («да», «нет», «М», «F»)? – Charlotte

Смежные вопросы