卡方矩阵残差
Chi square matrix residuals
下面是一个从多个卡方检验中提取 p 值并将其显示为矩阵的函数。我正在尝试做同样的事情,但改为提取残差。感谢任何帮助。
示例数据:
df <- data.frame(first_column = c(rep("E1_C1",5), rep("E1_C2",3), rep("E2_C2",7),rep("E3_C3",5)),
second_column = c(rep("E1_C1",3), rep("E1_C2",10), rep("E2_C2",4),rep("E3_C3",3)),
third_column = c(rep("E1_C1",7), rep("E1_C2",4), rep("E2_C2",3),rep("E3_C3",6)),
fourth_column = c(rep("E1_C1",4), rep("E1_C2",6), rep("E2_C2",6),rep("E3_C3",4))
)
P 值的卡方矩阵函数:
chisqmatrix <- function(x) {
names = colnames(x); num = length(names)
m = matrix(nrow=num,ncol=num,dimnames=list(names,names))
for (i in 1:(num-1)) {
for (j in (i+1):num) {
#browser()
m[j,i] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$p.value
}
}
return (m)
}
生成卡方 p 值矩阵
res <- chisqmatrix(df)
res[, -ncol(res)]
只需将您的函数从请求 $p.value 更改为请求 $residuals。这将提供(观察到的 - 预期的)/ sqrt(预期的)。如果您需要标准化残差请求 $stdres.
chisqmatrix <- function(x) {
names = colnames(x); num = length(names)
m = matrix(nrow=num,ncol=num,dimnames=list(names,names))
for (i in 1:(num-1)) {
for (j in (i+1):num) {
#browser()
m[j,i] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$residuals
}
}
return (m)
}
在您的例子中,返回的残差是一个 4x4 矩阵。下面的解决方案不是使用矩阵来获取结果,而是使用列表。这样你就可以拥有不同大小的矩阵。
对您的原始代码进行极少的更改:
chisqlist <- function(x) {
names = colnames(x); num = length(names)
m = list()
index = 1
for (i in 1:(num-1)) {
for (j in (i+1):num) {
#browser()
m[[index]] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$residuals
index=index+1
}
}
return (m)
}
编辑:
我确实更喜欢@Onyambu 的回答,但我没有看到。它会比嵌套的 for 循环更快。
下面是一个从多个卡方检验中提取 p 值并将其显示为矩阵的函数。我正在尝试做同样的事情,但改为提取残差。感谢任何帮助。
示例数据:
df <- data.frame(first_column = c(rep("E1_C1",5), rep("E1_C2",3), rep("E2_C2",7),rep("E3_C3",5)),
second_column = c(rep("E1_C1",3), rep("E1_C2",10), rep("E2_C2",4),rep("E3_C3",3)),
third_column = c(rep("E1_C1",7), rep("E1_C2",4), rep("E2_C2",3),rep("E3_C3",6)),
fourth_column = c(rep("E1_C1",4), rep("E1_C2",6), rep("E2_C2",6),rep("E3_C3",4))
)
P 值的卡方矩阵函数:
chisqmatrix <- function(x) {
names = colnames(x); num = length(names)
m = matrix(nrow=num,ncol=num,dimnames=list(names,names))
for (i in 1:(num-1)) {
for (j in (i+1):num) {
#browser()
m[j,i] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$p.value
}
}
return (m)
}
生成卡方 p 值矩阵
res <- chisqmatrix(df)
res[, -ncol(res)]
只需将您的函数从请求 $p.value 更改为请求 $residuals。这将提供(观察到的 - 预期的)/ sqrt(预期的)。如果您需要标准化残差请求 $stdres.
chisqmatrix <- function(x) {
names = colnames(x); num = length(names)
m = matrix(nrow=num,ncol=num,dimnames=list(names,names))
for (i in 1:(num-1)) {
for (j in (i+1):num) {
#browser()
m[j,i] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$residuals
}
}
return (m)
}
在您的例子中,返回的残差是一个 4x4 矩阵。下面的解决方案不是使用矩阵来获取结果,而是使用列表。这样你就可以拥有不同大小的矩阵。
对您的原始代码进行极少的更改:
chisqlist <- function(x) {
names = colnames(x); num = length(names)
m = list()
index = 1
for (i in 1:(num-1)) {
for (j in (i+1):num) {
#browser()
m[[index]] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$residuals
index=index+1
}
}
return (m)
}
编辑: 我确实更喜欢@Onyambu 的回答,但我没有看到。它会比嵌套的 for 循环更快。