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

问题描述 投票:0回答:1

有一个准长格式的 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 pivot lm melt
1个回答
0
投票

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

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 进行分组,并针对 B 运行 A 的线性模型:

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> 

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

© www.soinside.com 2019 - 2024. All rights reserved.