在R中通过循环运行模型、生成子集并为新数据集赋值列的问题
问题修正与解决方案
原代码的语法错误
你的代码存在几处语法和逻辑问题:
glm函数的括号位置错误,family=binomial被误写在函数括号外,且用glm做变量名会覆盖原函数,不推荐assign函数语法错误:参数顺序颠倒,括号未正确闭合,正确格式是assign(变量名字符串, 赋值对象)- 修改子集列后未重新赋值回全局变量,导致修改只在局部生效
修正后的循环代码
先加载你的数据集:
dat <- structure(list(ID = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3), A = c(1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0), B = c(0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1), C = c(1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1), M = c(1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6)), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -15L))
修正后的循环代码:
n <- max(dat$M) for (ii in 1:n) { # 拟合模型,用glm_model作为变量名避免冲突 glm_model <- glm(A ~ B + C, data = dat, subset = (M == ii), family = binomial) # 提取M=ii的子集 M_subset <- subset(dat, M == ii) # 给子集添加对应预测列 M_subset[[paste0("ps_", ii)]] <- predict(glm_model, type = 'response') # 将修改后的子集赋值到全局环境的M_1、M_2...变量 assign(paste0("M_", ii), M_subset) }
执行后,你会得到M_1到M_6的子集变量,每个变量都包含对应的ps_i预测列,无需担心不同ID的M值数量不一致的问题,subset和assign会自动处理单条数据的情况。
更推荐的替代方案:用列表存储子集
创建大量零散变量不利于后续管理,推荐用列表统一存储所有子集:
# 按M值拆分数据集为列表 M_list <- split(dat, dat$M) # 遍历列表,为每个子集添加预测列 M_list <- lapply(names(M_list), function(m_val) { subset_data <- M_list[[m_val]] glm_model <- glm(A ~ B + C, data = subset_data, family = binomial) subset_data[[paste0("ps_", m_val)]] <- predict(glm_model, type = 'response') subset_data }) # 给列表命名,方便索引 names(M_list) <- paste0("M_", 1:max(dat$M)) # 提取子集示例:获取M=1的子集 M_list$M_1
内容的提问来源于stack exchange,提问作者Statistix
相关产品推荐
相关产品推荐

