You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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组):

  1. 用变量A的value作为响应变量,变量B的value作为预测变量,拟合线性回归模型(lm);
  2. 计算当响应变量(A的value)为0时,对应的预测变量(B的value)取值;
  3. 将计算结果按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:01:05