You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无法找到正确的变量,从而报错。

解决步骤

  1. 优先避免使用attach():这是R中极易引发变量同步问题的操作,推荐直接通过数据框索引或dplyr管道操作访问变量。
  2. 明确指定变量所属数据框:若需保留attach(),调用contrasts()时需明确指向新数据框:
    contrasts(drug.spending$CAGR_Direction)
    
  3. 简化数据处理逻辑:优化去重和缺失值处理代码,提升可读性:
    # 替代手动去重的代码
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:52:02