Medicaid药品支出数据集逻辑回归:分类变量转换问题求助
问题描述
我正在分析Medicaid药品支出数据集,计划以CAGR_Avg_Spnd_Per_Dsg_Unt_18_22为基础构建因变量执行逻辑回归。参考《统计学习导论:R语言应用》中Smarket数据集的Direction变量(Up/Down)处理方式,我生成了CAGR_Direction变量,虽已将其转为因子类型,但执行contrasts(CAGR_Direction)时仍报错,尝试过as.numeric()、as.integer()等转换方法均未解决问题。
参考代码(来自《统计学习导论:R语言应用》)
# The library comes from Introduction to Statistical Learning: With Applications in R library(ISLR) attach(Smarket) summary(Smarket) # desired output: glm.fit=glm(Direction~Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume, family=binomial,data=Smarket) contrasts(Direction)
我的代码
library(dplyr) library(tidyr) library(psych) library(leaps) set.seed(1) spending <- read.csv("medicaid_spending_by_drug_data_dictionary.csv") drug.spending <- spending %>% na.omit(spending) %>% filter(Mftr_Name == "Overall") %>% arrange(desc(Tot_Mftr)) %>% filter(duplicated(Gnrc_Name)) drug.spending <- drug.spending[!duplicated(drug.spending$Gnrc_Name),] attach(drug.spending) drug.spending <- drug.spending %>% mutate(CAGR_Direction = ifelse(CAGR_Avg_Spnd_Per_Dsg_Unt_18_22 > 0, 'Up', 'Down')) drug.spending$CAGR_Direction <- factor(drug.spending$CAGR_Direction, levels = c('Down', 'Up')) # Update #1 summary(drug.spending) contrasts(CAGR_Direction) #gives an error
问题原因与解决方法
核心原因
你在attach(drug.spending)后重新赋值了drug.spending,导致附着的旧数据框与修改后的新数据框不同步——新生成的CAGR_Direction仅存在于新数据框中,直接调用contrasts(CAGR_Direction)时,R无法找到正确的变量,从而报错。
解决步骤
- 优先避免使用
attach():这是R中极易引发变量同步问题的操作,推荐直接通过数据框索引或dplyr管道操作访问变量。 - 明确指定变量所属数据框:若需保留
attach(),调用contrasts()时需明确指向新数据框:contrasts(drug.spending$CAGR_Direction) - 简化数据处理逻辑:优化去重和缺失值处理代码,提升可读性:
# 替代手动去重的代码 distinct(Gnrc_Name, .keep_all = TRUE) # 简化na.omit调用 na.omit()
优化后完整代码
library(dplyr) library(tidyr) library(psych) library(leaps) set.seed(1) spending <- read.csv("medicaid_spending_by_drug_data_dictionary.csv") drug.spending <- spending %>% na.omit() %>% filter(Mftr_Name == "Overall") %>% arrange(desc(Tot_Mftr)) %>% filter(duplicated(Gnrc_Name)) %>% distinct(Gnrc_Name, .keep_all = TRUE) # 直接在mutate中生成因子变量 drug.spending <- drug.spending %>% mutate(CAGR_Direction = factor( ifelse(CAGR_Avg_Spnd_Per_Dsg_Unt_18_22 > 0, 'Up', 'Down'), levels = c('Down', 'Up') )) summary(drug.spending) contrasts(drug.spending$CAGR_Direction) # 明确指定数据框,避免变量同步问题
内容的提问来源于stack exchange,提问作者Brad Presson
相关产品推荐
相关产品推荐

