Come verificare la correlazione tra variabile indipendente categoriale e numerica in R? [duplicare]
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
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 ltm
pacchetto.
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 logit
modello 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))
