对 R 中每个唯一的两列对执行长格式线性回归(当另一列中存在重复项时)。确定何时 response=0

long format linear regression performed over each unique two column pairing in r (when duplicates exist in another column). Determine when response=0

提问人:user11057680 提问时间:10/11/2023 最后编辑:user11057680 更新时间:10/11/2023 访问量:76

问:

具有准长格式的 DF:

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。执行 lm,变量 A(其关联值)作为响应变量,变量 B 作为预测变量(其关联值),然后是 2。确定(如果可能,则绑定)生成响应值 0 的预测变量值。

我已将变量列转换为因子,然后尝试pivot_wider、pivot_longer、dcast 等,但显然无济于事,因为该变量具有重复的名称(如果转换为因子,则为因子水平)。无需进一步旋转,就可以运行 lm 并确定 0 点,然后将其绑定到每个唯一 X,Y 配对的原始 df。

这是要填充最后一列的所需输出的示例:

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"))
R DPLYR 枢轴 LM 熔体

评论

0赞 Onyambu 10/11/2023
举一个例子来说明这对1,1
0赞 Gregor Thomas 10/11/2023
我不明白。“对于每个唯一的 X,Y 配对(有 4 个)”......你的意思是 #1 X = 1,Y = 1;#2 x = 2, y = 2;...等。?然后“执行变量 1(其关联值)作为响应的 lm”,在这种情况下,“变量 1”是什么?什么是预测变量“变量 2”?您能给我们介绍一下第一个 X,Y 配对的例子吗?
0赞 user11057680 10/11/2023
是的,正在编辑这个。是的,它是 X=1,Y=1,X=2,Y=2 等,变量字符串曾经是 A、A、B、B、A1、A1、B1、B1 字符,但是我使用 gsub 删除字符串的数字部分,因为它们都是一样的。最初是宽幅的,我融化了。
0赞 user11057680 10/11/2023
作为对第一条评论的回应,lm 的一个粗略例子是 #lm_XY_11 <- lm(df, A 由 c(.5,.7) ~ B c(1000,2000)) #lm_XY_22 <- lm(df, A 由 c(.6,.8) ~ B c(1000,2000)) 组成)
0赞 Onyambu 10/11/2023
您能否发布数据的未熔化版本。看来你做错了

答:

1赞 Onyambu 10/11/2023 #1

使用宽数据,将其重新排列为如下所示:

new_dat <- df_wide %>%
  rename_with(~str_replace(.x,'(A|B)$', '\\10')) %>%
  pivot_longer(A0:B1, names_to = c('.value', 'grp'),
               names_pattern = '(.)(.)')

     X     Y grp       A     B
  <dbl> <dbl> <chr> <dbl> <dbl>
1     1     1 0       0.5  1000
2     1     1 1       0.7  2000
3     2     2 0       0.6  1000
4     2     2 1       0.8  2000

现在在上面的数据中,您可以轻松地按 X 和 Y 分组,并运行 A 对 B 的线性模型:

new_dat %>% 
  summarise(model=list(lm(A~B)), .by = c(X,Y))

# A tibble: 2 × 3
      X     Y model 
  <dbl> <dbl> <list>
1     1     1 <lm>  
2     2     2 <lm> 

您现在可以使用每组拟合的线性模型进行预测等

评论

0赞 user11057680 10/11/2023
这看起来很有希望,但是,如果您有标题为 A、B、A_1、B_1、A_1_2、B_1_2 的字符串,您能否使用部分代码调整重命名?基本上我使用 gsub(“\_.*”,“”, x = names(df_wide)) 来删除所有带有下划线和 after 的字符,然后在 after 排序并不是最简单的。
0赞 Onyambu 10/11/2023
@user11057680 不应删除这些字符。使用它们进行透视。您需要以两列结束。即 A 列和 B 列。执行 groupby 并在 a 上针对 b 运行 lm
0赞 user11057680 10/11/2023
我在 gsub 之后使用了粘贴和代表来删除任何下划线并在之后添加序列后缀,所以现在出现列名称:beep0、blah0、beep1、blah1、beep2、blah2、beep、blah4,....,beep27、blah27。然后我执行你的pivot_longer部分(哔哔0:blah27...),它创建了两个组,但哔哔声和哔哔声没有被拆分出来,它们保留在一个共享列中。猜测它是names_pattern部分。 例如,如果列都以 B 开头,可能会有麻烦。
0赞 user11057680 10/24/2023
对于其他感兴趣的人,当 B = 为给定值(在此测试用例中为 0)时,可以使用 sapply 对 A 进行逐行预测。我相信有一种更方便的方法可以将这一切包裹在管道中,尽管之前没有提供。pred_df <- data.frame(B = 0) lm_predict <- 函数 (m) predict(m,pred_df) new_dat$lm_pred_0 <- sapply(new_dat$model,lm_predict)
0赞 user11057680 10/11/2023 #2
new_dat <- pivot_longer(df_wide,cols = -c(X,Y), 
                                  names_to = c('.value', 'grp'), 
                                  names_pattern = '([a-zA-Z]+)(\\d+)')

解决了问题。