提问人:user11057680 提问时间:10/11/2023 最后编辑:user11057680 更新时间:10/11/2023 访问量:76
对 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
问:
具有准长格式的 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"))
答:
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+)')
解决了问题。
评论
1,1