Мои вопросы касаются расчета 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 не могу обнаружить никаких ошибок ... Может ли кто-нибудь мне помочь?
так вы не определяете '' '' как уровень в a2 и b2, а не то, что вы хотите (т. е. вам не нужно создавать a3: 'a [a ==" "] <- NA; a3 <- капли (a) ')? когда вы делаете таблицу, вы должны явно использовать 'table (..., useNA = 'ifany')', чтобы сохранить NA, поэтому вы уже их исключаете. Поэтому 'assocstats (table (a2, b2))' должен работать – rawr
В моем наборе данных у меня есть уровень "", и я должен удалить их с помощью капель, поэтому я создал этот набор данных таким образом, я не хочу поддерживать НС.И я не понимаю, почему функция asocstats создает NaN при их удалении. – Charlotte
Я думаю, что вы получили NaN, вы удалили их в a и сбросили уровни для a3, но вы не сделали то же самое для b – rawr