Come verificare la correlazione tra variabile indipendente categoriale e numerica in R? [duplicare]

Aug 22 2020

Mi chiedo solo se devo controllare la correlazione tra la variabile indipendente categoriale e numerica in R, c'è qualche pacchetto specifico disponibile in R. O dovrei solo trovare la correlazione tra la variabile indipendente numerica?

Risposte

2 BenNorris Aug 22 2020 at 20:20

Esistono diversi modi per determinare la correlazione tra una variabile categoriale e una continua. Tuttavia, ho trovato solo un modo per calcolare un "coefficiente di correlazione" e funziona solo se la variabile categoriale è dicotomica.

Se la tua variabile categoriale è dicotomica (solo due valori), puoi utilizzare la correlazione punto-biseriale . C'è una funzione per farlo nel ltmpacchetto.

library(ltm)
# weakly correlated example
set.seed(123)
x <- rnorm(100)
y <- factor(sample(c("A", "B"), 100, replace = TRUE))
biserial.cor(x, y)
[1] -0.07914586 
# strongly correlated example
biserial.cor(mtcars$mpg, mtcars$am)
[1] -0.5998324

È possibile eseguire una regressione logistica e utilizzarne varie valutazioni (accuratezza, ecc.) Al posto di un coefficiente di correlazione. Ancora una volta, questo funziona meglio se la tua variabile categoriale è dicotomica.

# weakly correlated
set.seed(123)
x <- rnorm(100)
y <- factor(sample(c("A", "B"), 100, replace = TRUE))
logit <- glm(y ~ x, family = "binomial")
# Accuracy
sum(round(predict(logit, type = "response")) == as.numeric(y)) / length(y)
[1] 0.15
# Sensitivity
sum(round(predict(logit, type = "response")) == as.numeric(y) & as.numeric(y) == 1) /
                         sum(as.numeric(y))
[1] 0.1013514
# Precision
sum(round(predict(logit, type = "response")) == as.numeric(y) & as.numeric(y) == 1) /
                         sum(round(predict(logit, type = "response") == 1))
[1] Inf
enter code here
# strongly correlated
mt_logit <- glm(am~mpg, data = mtcars, family = "binomial")
mt_pred <- round(predict(mt_logit, type = "response"))
# Accuracy
sum(mt_pred == mtcars$am) / nrow(mtcars) [1] 0.75 # Sensitivity sum(mt_pred == mtcars$am & mtcars$am == 1) / sum(mtcars$am)
[1] 0.5384615
# Precision
sum(mt_pred == mtcars$am & mtcars$am == 1) /
                         sum(mt_pred == 1)
[1] 0.7777778

Ancora una volta, se i tuoi dati categoriali sono dicotomici, potresti eseguire il test della somma dei ranghi di Wilcoxon a due campioni . La wilcox.test()funzione è disponibile in base R. Questa è una variazione non parametrica dell'ANOVA.

# weakly correlated
set.seed(123)
x <- rnorm(100)
y <- factor(sample(c("A", "B"), 100, replace = TRUE))
df <- data.frame(x = x, y = y)
wt <- wilcox.test(df$x[which(df$y == "A")], df$x[which(df$y == "B")])
    Wilcoxon rank sum test with continuity correction

data:  df$x[which(df$y == "A")] and df$x[which(df$y == "B")]
W = 1243, p-value = 0.9752
alternative hypothesis: true location shift is not equal to 0

# strongly correlated
wilcox.test(mtcars$mpg[which(mtcars$am == 1)], 
            mtcars$mpg[which(mtcars$am == 0)], exact = FALSE) # exact = FALSE because there are ties
    Wilcoxon rank sum test with continuity correction

data:  mtcars$mpg[which(mtcars$am == 1)] and mtcars$mpg[which(mtcars$am == 0)]
W = 205, p-value = 0.001871
alternative hypothesis: true location shift is not equal to 0

Potresti anche eseguire un'ANOVA sul tuo logitmodello da prima.

# weakly correlated
anova(logit)
    Analysis of Deviance Table

Model: binomial, link: logit

Response: y

Terms added sequentially (first to last)


     Df Deviance Resid. Df Resid. Dev
NULL                    99     138.47
x     1  0.62819        98     137.84

# strongly correlated
anova(mt_logit)
Analysis of Deviance Table

Model: binomial, link: logit

Response: am

Terms added sequentially (first to last)


     Df Deviance Resid. Df Resid. Dev
NULL                    31     43.230
mpg   1   13.555        30     29.675

Se la tua variabile categoriale non è dicotomica, puoi utilizzare il test di Kruskal-Wallis .

# weakly correlated
set.seed(123)
x <- rnorm(100)
y <- factor(sample(c("A", "B", "C"), 100, replace = TRUE))
kruskal.test(x~y)
    Kruskal-Wallis rank sum test

data:  x by y
Kruskal-Wallis chi-squared = 0.62986, df = 2, p-value = 0.7298

# strongly correlated
kruskal.test(mpg ~ cyl, data = mtcars)
    Kruskal-Wallis rank sum test

data:  mpg by cyl
Kruskal-Wallis chi-squared = 25.746, df = 2, p-value = 2.566e-06

Infine, puoi semplicemente ispezionare i tuoi dati visivamente usando alcuni grafici a scatole. Se i tuoi dati sono debolmente correlati, ci sarà molta sovrapposizione tra le caselle.

library(ggplot2)
# weakly correlated
set.seed(123)
y <- rnorm(100)
x <- factor(sample(c("A", "B", "C"), 100, replace = TRUE))
df <- data.frame(x = x, y = y)
ggplot(df) + geom_boxplot(aes(x, y))   

# strongly correlated
ggplot(mtcars) + geom_boxplot(aes(x = factor(cyl), y = mpg))