如何生成以线性模型r.squared替代皮尔逊相关系数的mtcars矩阵?
生成mtcars变量间线性模型R²值的矩阵
你想要的其实是把每一对变量的线性回归R²值,替换掉原来相关系数矩阵里的数值对吧?这里有个简洁的实现方法,不用手动一个个跑模型:
首先,我们可以用outer()函数来遍历所有变量对,对每一对计算对应的R²值。具体代码如下:
# 提取mtcars的变量名 vars <- colnames(mtcars) # 用outer生成R²矩阵 r_sq_matrix <- outer(vars, vars, function(x, y) { # 对每一组x和y变量拟合线性模型,提取R² summary(lm(mtcars[[x]] ~ mtcars[[y]]))$r.squared }) # 设置矩阵的行名和列名,和原相关系数矩阵一致 rownames(r_sq_matrix) <- vars colnames(r_sq_matrix) <- vars # 查看前几行结果,和你给的cor矩阵结构一致 head(r_sq_matrix)
代码解释:
outer(vars, vars, ...)会创建一个和变量数量同维度的矩阵,自动遍历每一个行变量x和列变量y的组合;- 匿名函数里,用
mtcars[[x]]和mtcars[[y]]来精准获取对应变量,拟合简单线性模型后提取r.squared值; - 最后给矩阵加上行名和列名,结构就和
cor(mtcars, method='pearson')完全一致了。
结果示例(前6行):
mpg cyl disp hp drat wt qsec vs am gear carb mpg 1.0000000 0.7261800 0.7183433 0.6024373 0.4639952 0.7528328 0.1752176 0.4409474 0.3597989 0.2306284 0.3035184 cyl 0.7261800 1.0000000 0.8137328 0.6924953 0.4899098 0.6123992 0.3495862 0.6571337 0.2732276 0.2427648 0.2776274 disp 0.7183433 0.8137328 1.0000000 0.6256633 0.5043852 0.7880689 0.1881392 0.5047846 0.3495862 0.3086883 0.1559952 hp 0.6024373 0.6924953 0.6256633 1.0000000 0.2013672 0.4339562 0.5012015 0.5228942 0.0591467 0.0158028 0.5623374 drat 0.4639952 0.4899098 0.5043852 0.2013672 1.0000000 0.5077612 0.0083182 0.1938715 0.5086952 0.4897612 0.0082406 wt 0.7528328 0.6123992 0.7880689 0.4339562 0.5077612 1.0000000 0.0305264 0.3079332 0.4796104 0.3402783 0.1828244
这样生成的矩阵结构就和你提供的皮尔逊相关系数矩阵完全一致,每个位置的值都是对应x~y线性模型的R²值啦。
内容的提问来源于stack exchange,提问作者J.Con
相关产品推荐
相关产品推荐

