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)
关键修正点
- 因变量修正:原代码错误地将
category作为因变量,实际应是quantity(对应公式中被解释变量)。 - 基准水平生效:
relevel()需要重新赋值给原变量,否则不会修改数据框中的因子水平。 - 公式简化:
year*state*district已包含三者的所有交互项及主效应,无需重复添加year + state + district。 - 数据子集逻辑:只需针对每个
category取值筛选数据,year作为因子变量会自动覆盖所有年份的效应,对应公式中的求和项。
内容的提问来源于stack exchange,提问作者ithoughtso
相关产品推荐
相关产品推荐

