在R中针对唯一X,Y配对执行线性回归并求响应为0时的预测值
问题描述
现有如下长格式R数据框:
df <- data.frame(X= c(1,2,1,2,1,2,1,2), Y= c(1,2,1,2,1,2,1,2), variable = c("A","A","B","B","A","A","B","B"), value = c(.5,.6,1000,1000,.7,.8,2000,2000))
核心需求
针对每一组唯一的X,Y配对(共2组):
- 用变量
A的value作为响应变量,变量B的value作为预测变量,拟合线性回归模型(lm); - 计算当响应变量(A的value)为0时,对应的预测变量(B的value)取值;
- 将计算结果按
X,Y配对与原始数据关联。
遇到的阻碍
已经把variable列转为因子,尝试过pivot_wider、pivot_longer、dcast等数据重塑函数,但因为存在重复变量名失败,希望不用重塑数据就能完成计算。
期望输出示例
desired <- data.frame(X= c(1,2), Y= c(1,2), pred_value_B_when_response_A_equals_0 = c(NA,NA))
补充背景
原始宽格式数据框及转换为长格式的代码如下:
宽格式数据:
df_wide <- data.frame(X=c(1,2), Y=c(1,2), A=c(.5,.6), B=c(1000,1000), A1=c(.7,.8), B1=c(2000,2000))
转换为长格式的代码:
df <- reshape2::melt(df_wide, id.vars = c("X","Y"))
解决方案
直接用dplyr的分组功能,在每个X,Y组内提取A和B对应的value序列,无需重塑数据即可完成回归计算:
library(dplyr) result <- df %>% group_by(X, Y) %>% summarise( pred_value_B_when_response_A_equals_0 = { # 提取当前组内A、B对应的value A_vals <- value[variable == "A"] B_vals <- value[variable == "B"] # 检查是否能拟合有效回归:至少需要2个不同的B值才能计算斜率 if(length(unique(B_vals)) < 2){ NA_real_ } else { # 拟合线性回归模型 model <- lm(A_vals ~ B_vals) # 推导A=0时的B值:0 = 截距 + 斜率*B → B = -截距/斜率 -coef(model)[[1]] / coef(model)[[2]] } }, .groups = "drop" ) # 查看最终结果 print(result)
结果说明
- 对于
X=1,Y=1组,B的取值为1000和2000(两个不同值),可以正常拟合模型并计算出对应B值; - 如果某组内
B的取值全部相同(无法计算斜率),则返回NA,对应示例中的占位值。
内容的提问来源于stack exchange,提问作者user11057680
相关产品推荐
相关产品推荐

