楼主: fengzhenbai
5566 9

[有偿编程] 如何用for循环实现批量回归? [推广有奖]

  • 0关注
  • 0粉丝

本科生

51%

还不是VIP/贵宾

-

威望
0
论坛币
529 个
通用积分
0.0750
学术水平
2 点
热心指数
1 点
信用等级
1 点
经验
329 点
帖子
24
精华
0
在线时间
166 小时
注册时间
2007-10-10
最后登录
2024-4-24

20论坛币
请高人指点:如何用for循环实现线性回归?
如附件里内容,列由obs, category, year, y, x1, x2, x3, ,行分别由3000多个观测值构成时间序列,一个obs都用统一的代号。现在想对每一个进行多元线性回归,y为因变量,x1,x2,x3为自变量,如何用rstudio实现线性回归?请哪位大神帮忙写一下代码,20个币悬赏。

最佳答案

owenqi 查看完整内容

你这个数据里面存在缺失值,你没有说明如何处理,那我就默认把含有缺失值的观测都删除了。这里因为你要求的东西比较简单,所以写for循环问题也不大 当然,通常个人比较习惯的还是使用broom和tidyr的配合,这样根据实际情况筛选需要的统计量。可以参考这个回答。
关键词:for循环 批量回归 如何用 For Category
沙发
owenqi 在职认证  学生认证  发表于 2022-1-27 15:09:48 |只看作者 |坛友微信交流群
你这个数据里面存在缺失值,你没有说明如何处理,那我就默认把含有缺失值的观测都删除了。这里因为你要求的东西比较简单,所以写for循环问题也不大
  1. df <- readxl::read_excel("dfs.xlsx")

  2. library(dplyr)
  3. library(tidyr)

  4. # show na rows
  5. df %>% filter(is.na(x1)|is.na(x2)|is.na(x3))

  6. # remove na obs in x3
  7. df <- df %>% select(-year, -category) %>% drop_na(x1, x2, x3)

  8. # method #1 by for loop
  9. df_lst <- split(df, df$obs)
  10. n <- length(df_lst)
  11. tbl <- matrix(NA, ncol = 6, nrow = n)

  12. for(i in 1:length(df_lst)){
  13.   obs <- unique(df_lst[[i]]$obs)
  14.   fit <- lm(y ~ ., data = df_lst[[i]][,-1])
  15.   tbl[i,] <- c(obs, fit$coefficients, summary(fit)$r.squared)
  16. }

  17. colnames(tbl) <- c('obs','intercept', 'x1', 'x2', 'x3', 'r.squared')
复制代码


当然,通常个人比较习惯的还是使用broom和tidyr的配合,这样根据实际情况筛选需要的统计量。可以参考这个回答。
https://stackoverflow.com/questions/22713325/fitting-several-regression-models-with-dplyr
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

藤椅
fengzhenbai 发表于 2022-1-28 11:46:27 |只看作者 |坛友微信交流群
owenqi 发表于 2022-1-28 05:04
你这个数据里面存在缺失值,你没有说明如何处理,那我就默认把含有缺失值的观测都删除了。这里因为你要求的 ...
+     ob <- unique(df_lst[]$ob)
+     fit <- lm(y ~ ., data = df_lst[][,-1])
+     tbl[i,] <- c(ob, fitcoefficients,summary(fit)coefficients, summary(fit)r.squared)}
Error: unexpected symbol in:
"    fit <- lm(y ~ ., data = df_lst[][,-1])
    tbl[i,] <- c(ob, fitcoefficients,summary(fit)coefficients"
>
> colnames(tbl) <- c('ob','intercept', 'x1', 'x2', 'x3', 'r.squared')
>太感谢了!但是, 运行到回归赋值这一步就报错了,不知道问题出在哪里?

使用道具

板凳
owenqi 在职认证  学生认证  发表于 2022-1-28 13:40:28 |只看作者 |坛友微信交流群
fengzhenbai 发表于 2022-1-28 11:46
+     ob
应该是论坛的一些功能错误,代码第20行,fit_coefficents,这个地方的美元符号我现在用下划线代替了,不然文本读成markdown的格式了。

使用道具

报纸
fengzhenbai 发表于 2022-1-28 15:59:55 |只看作者 |坛友微信交流群
owenqi 发表于 2022-1-28 13:40
应该是论坛的一些功能错误,代码第20行,fit_coefficents,这个地方的美元符号我现在用下划线代替了,不然 ...
+     fit <- lm(y ~ ., data = df_lst[][,-1])
+     tbl[i,] <- c(ob, fit$coefficients,summary(fit)coefficients, summary(fit)r.squared)}
Error: unexpected symbol in:
"    fit <- lm(y ~ ., data = df_lst[][,-1])
    tbl[i,] <- c(ob, fit$coefficients,summary(fit)coefficients"
>
> colnames(tbl) <- c('ob','intercept', 'x1', 'x2', 'x3', 'r.squared')

还是出现了不能识别的问题,真不好意思。

使用道具

地板
fengzhenbai 发表于 2022-1-28 22:39:42 |只看作者 |坛友微信交流群
owenqi 发表于 2022-1-28 13:40
应该是论坛的一些功能错误,代码第20行,fit_coefficents,这个地方的美元符号我现在用下划线代替了,不然 ...
大神,能不能再帮忙看一下,加了美元符号还是和原来一样报错,就差这一步了。跪谢了!

使用道具

7
escaflowne1985 在职认证  发表于 2022-1-28 22:52:24 |只看作者 |坛友微信交流群
for i in range(len(df)) 就可以了

使用道具

8
escaflowne1985 在职认证  发表于 2022-1-28 22:52:25 |只看作者 |坛友微信交流群
for i in range(len(df)) 就可以了

使用道具

9
owenqi 在职认证  学生认证  发表于 2022-1-29 00:44:34 |只看作者 |坛友微信交流群
fengzhenbai 发表于 2022-1-28 15:59
+     fit  colnames(tbl)
你是不是粘贴我代码的时候出了问题,拟合模型那里,我的代码是
  1. fit <- lm(y ~ ., data = df_lst[[i]][,-1])
复制代码
你贴在回复里面的是
  1. fit <- lm(y ~ ., data = df_lst[][,-1])
复制代码
df_lst后面完全不一样。

使用道具

10
fengzhenbai 发表于 2022-1-30 21:57:22 |只看作者 |坛友微信交流群
owenqi 发表于 2022-1-29 00:44
你是不是粘贴我代码的时候出了问题,拟合模型那里,我的代码是你贴在回复里面的是df_lst后面完全不一样。
非常感谢!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 18:26