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

R语言回归方程添加求和项时的data参数重复错误解决问询

问题:带求和项的回归公式在R中实现报错

我想在R中实现如下回归公式(i为category的每个取值,category可选1、2、3、4):
公式核心为:针对每个category=i,拟合quantity关于year×state×district交互项、各主效应的回归,其中交互项覆盖所有年份的组合。

运行尝试代码时触发错误:

Error in lm(category ~ (year * state * district) + year + state + district + :
formal argument "data" matched by multiple actual arguments

我试图通过多次传入不同年份子集的data参数来实现公式中的求和逻辑,但触发了上述错误,想知道正确的实现方式。

我的尝试代码:

ID <-  c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
         17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
         33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48)
year <- c(1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,
      1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,
      1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982)
 state <-     c("NY","NY","NY","NY","NY","NY","NY","NY","CA","CA","CA","CA","CA","CA","CA","CA",
      "NY","NY","NY","NY","NY","NY","NY","NY","CA","CA","CA","CA","CA","CA","CA","CA",
      "NY","NY","NY","NY","NY","NY","NY","NY","CA","CA","CA","CA","CA","CA","CA","CA")
district <- c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,
          1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,
          1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)
quantity <- c(100,200,45,87,65,32,94,52,67,72,14,53,28,94,12,41,
          10,20,45,87,65,32,8,52,67,1,14,53,28,94,12,41,
          1000,2000,45,87,9,32,94,5,6,7,1,5,2,9,1,4)
category <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
   1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
   1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)

df <- data.frame(ID,year,state,district,quantity,category)

df$year <- as.factor(df$year)
df$state <- as.factor(df$state)
df$district <- as.factor(df$district)
df$category <- as.factor(df$category)

print(df)

# force regression baseline values 
relevel(df$year, ref = '1981')
relevel(df$district, ref = '2')

# r1 is when y = 1
r1 <- lm( category ~ (year*state*district) +  
           quantity + district + state + year,
           data = subset(df, year == 1980)
      +
        (year*state*district) +  
         quantity + district + state + year,
         data = subset(df, year == 1981)
      +
        (year*state*district) +  
         quantity + district + state + year,
         data = subset(df, year == 1980)
     )
summary(r1)

# r2 is when y = 2
r2 <- lm( category ~ (year*state*district) +  
        year + state + district + quantity,
      data = subset(df, year == 1980)
      +
        (year*state*district) +  
        year + state + district + quantity,
      data = subset(df, year == 1981)
      +
        (year*state*district) +  
        year + state + district + quantity,
      data = subset(df, year == 1980)
)
summary(r2)

then r3 and r4

解决方案

你误解了lm()的使用逻辑:不能通过多次传入data参数实现求和,回归公式中的求和项本质是让模型覆盖所有年份的交互效应,只需在全数据集的对应category子集上拟合即可。

修正后的代码:

ID <-  c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
         17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
         33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48)
year <- c(1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,1980,
      1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,
      1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982)
state <-     c("NY","NY","NY","NY","NY","NY","NY","NY","CA","CA","CA","CA","CA","CA","CA","CA",
      "NY","NY","NY","NY","NY","NY","NY","NY","CA","CA","CA","CA","CA","CA","CA","CA",
      "NY","NY","NY","NY","NY","NY","NY","NY","CA","CA","CA","CA","CA","CA","CA","CA")
district <- c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,
          1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,
          1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)
quantity <- c(100,200,45,87,65,32,94,52,67,72,14,53,28,94,12,41,
          10,20,45,87,65,32,8,52,67,1,14,53,28,94,12,41,
          1000,2000,45,87,9,32,94,5,6,7,1,5,2,9,1,4)
category <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
   1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
   1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)

df <- data.frame(ID,year,state,district,quantity,category)

# 转换因子并设置基准水平(需重新赋值生效)
df$year <- relevel(as.factor(df$year), ref = '1981')
df$state <- as.factor(df$state)
df$district <- relevel(as.factor(df$district), ref = '2')
df$category <- as.factor(df$category)

# 针对每个category取值拟合模型
# 注:year*state*district已包含所有交互项及主效应,无需重复添加
r1 <- lm(quantity ~ year*state*district, 
         data = subset(df, category == 1))
summary(r1)

r2 <- lm(quantity ~ year*state*district, 
         data = subset(df, category == 2))
summary(r2)

r3 <- lm(quantity ~ year*state*district, 
         data = subset(df, category == 3))
summary(r3)

r4 <- lm(quantity ~ year*state*district, 
         data = subset(df, category == 4))
summary(r4)

关键修正点

  1. 因变量修正:原代码错误地将category作为因变量,实际应是quantity(对应公式中被解释变量)。
  2. 基准水平生效:relevel()需要重新赋值给原变量,否则不会修改数据框中的因子水平。
  3. 公式简化:year*state*district已包含三者的所有交互项及主效应,无需重复添加year + state + district。
  4. 数据子集逻辑:只需针对每个category取值筛选数据,year作为因子变量会自动覆盖所有年份的效应,对应公式中的求和项。

内容的提问来源于stack exchange,提问作者ithoughtso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:17:02