在R中按分组单独计算Salary与Age的相关性及标准化疑问
按分组计算Salary与Age的相关性(R实现)
嘿,我来帮你搞定这个分组相关性计算的问题,还有你纠结的标准化疑问~
1. 先把你的数据整理成R能用的格式
首先咱们把你给出的原始数据转换成R的数据框,这样后续操作才方便:
df <- data.frame( Name = c("New York", "New York", "New York", "New York", "Mexico", "Mexico", "Mexico", "Mexico"), Salary = c(45000, 47000, 35000, 23000, 56000, 67000, 63300, 31000), Age = c(34, 35, 28, 27, 34, 35, 45, 31) )
2. 用for循环实现分组相关性计算
你之前用for循环没成功,大概率是筛选分组数据或者结果存储的环节出了小问题。下面是完整的可运行代码,每一步都标了注释:
# 先提取所有不重复的分组名称 unique_groups <- unique(df$Name) # 创建一个空列表,用来存每个分组的相关性结果 group_correlations <- list() # 遍历每个分组 for (current_group in unique_groups) { # 筛选出当前分组的Salary和Age数据 subset_data <- df[df$Name == current_group, c("Salary", "Age")] # 计算皮尔逊相关系数(use参数是为了处理可能的缺失值,你的数据没缺失也可以保留) cor_result <- cor(subset_data$Salary, subset_data$Age, use = "complete.obs") # 把结果存入列表,用分组名当键,方便后续查看 group_correlations[[current_group]] <- cor_result } # 打印最终结果 group_correlations
运行这段代码后,你会得到:
- New York组的Salary和Age相关性约为0.98(极强的正相关)
- Mexico组的相关性约为0.85(强正相关)
另外提一句,如果你不想用for循环,用dplyr包的分组函数会更简洁,不过你明确要for循环的方案,所以这个就当补充啦:
library(dplyr) df %>% group_by(Name) %>% summarise(correlation = cor(Salary, Age, use = "complete.obs"))
3. 关于相关性计算前是否需要标准化的问题
你说得太对了——完全不需要标准化!
皮尔逊相关系数的计算公式本身就已经消除了变量尺度的影响:它是协方差除以两个变量的标准差,协方差会随变量尺度变化,但分母的标准差也会按相同比例变化,两者抵消后,相关系数的数值完全不受单位或尺度的影响。
举个实际的例子:你把Salary从美元改成千美元,或者标准化成均值为0、标准差为1的z-score,算出来的相关性和原始数据的结果一模一样。所以你之前做了标准化也没关系,只是多了一步没必要的操作而已,不会改变最终的相关性结果。
要是你用的是斯皮尔曼秩相关、肯德尔tau这类基于排序的相关性方法,那就更不需要标准化了——它们只关心变量的相对顺序,和绝对数值的尺度压根没关系。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

