为何维度看似相同的两个R矩阵无法执行矩阵乘法?
解决矩阵乘法维度不兼容问题及LCA协变量概率可视化
错误原因
你遇到的non-conformable arguments错误是因为矩阵乘法的维度不匹配:
often是6行2列的矩阵(6个参数×2个潜在类别)- 你构造的
pidmat是6行2列的矩阵,而矩阵乘法要求左矩阵的列数必须等于右矩阵的行数,这里2≠6,因此无法执行乘法。
正确构造pidmat矩阵
你的often矩阵行对应截距和协变量的5个虚拟变量(以第1级为参照组),因此需要为每个协变量水平(共6级)创建对应的设计向量,每个向量长度为6(匹配often的行数):
# 构造6×6的设计矩阵 pidmat <- matrix(0, nrow = 6, ncol = 6) pidmat[, 1] <- 1 # 所有水平的截距项为1 # 为每个协变量水平设置对应的虚拟变量为1 pidmat[2, 2] <- 1 # 对应sui_thoughts_often2 pidmat[3, 3] <- 1 # 对应sui_thoughts_often3 pidmat[4, 4] <- 1 # 对应sui_thoughts_often4 pidmat[5, 5] <- 1 # 对应sui_thoughts_often5 pidmat[6, 6] <- 1 # 对应sui_thoughts_often6
或者更简洁的写法:
pidmat <- diag(6) pidmat[, 1] <- 1
计算类别概率并可视化
现在可以正常执行矩阵乘法,然后计算每个协变量水平下的潜在类别概率:
# 计算指数项 exb <- exp(pidmat %*% often) # 归一化得到概率(每行和为1) probs <- exb / rowSums(exb) # 转换为数据框用于可视化 probs_df <- as.data.frame(probs) probs_df$covariate_level <- factor(1:6, labels = paste("Level", 1:6)) colnames(probs_df) <- c("Class_1", "Class_2", "Covariate_Level") # 转为长格式方便绘图 library(tidyr) probs_long <- pivot_longer(probs_df, cols = c(Class_1, Class_2), names_to = "Latent_Class", values_to = "Probability") # 绘制分组柱状图 library(ggplot2) ggplot(probs_long, aes(x = Covariate_Level, y = Probability, fill = Latent_Class)) + geom_col(position = "dodge", width = 0.7) + labs(title = "LCA潜在类别概率随协变量水平变化", x = "协变量水平", y = "概率") + theme_minimal()
内容的提问来源于stack exchange,提问作者Plima167
相关产品推荐
相关产品推荐

