将国家固定效应引入 glm() 并设置 "reference country"

Introduce country fixed effects to glm() and set "reference country"

我需要在 R 中将固定效应(在本例中为:国家虚拟变量)引入一个简单的 glm()

我数据中的国家/地区固定效应变量如下所示:

country   country_a   country_b   country_c   y   x   ...
1         1           0           0
1         1           0           0
2         0           1           1
2         0           1           1

这是否是技术上实施它的正确方法?见下文... glm(y ~ x + country_a + country_b + country_c, family=binomial(link="logit"))

如果是这样,我如何将特定国家/地区设置为参考类别?我知道我需要放弃一个国家,因为如果我不这样做,我就会有完美的共线性。通常这将是我的参考国家。但是,如果其他国家 "go NA" 也仅仅是因为它们在数据中只出现了几次,因此从分析中消失了(列表删除)怎么办?如果我决定放弃,country_a 仍然是我的参考类别吗?

或者我是否必须首先使用 Country 变量(左列)并且必须以某种方式告诉 glm() 这是一个无序的因素?如果是这样,我该怎么做?

数据如下:

> d
  country         y         x
1       1 0.9610213 0.2586365
2       1 0.8561303 0.5972043
3       2 0.5463802 0.6412527
4       2 0.4703876 0.1126319

您可以在 glm 调用中转换为因子:

> glm(y~factor(country),data=d)

Call:  glm(formula = y ~ factor(country), data = d)

Coefficients:
     (Intercept)  factor(country)2  
          0.9086           -0.4002  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      0.1685 
Residual Deviance: 0.008388     AIC: -7.317

或者创建一个新列,明确表示它不是数字:

> d$CountryCode = paste0("Country",d$country)
> d
  country         y         x CountryCode
1       1 0.9610213 0.2586365    Country1
2       1 0.8561303 0.5972043    Country1
3       2 0.5463802 0.6412527    Country2
4       2 0.4703876 0.1126319    Country2
> glm(y~CountryCode,data=d)

Call:  glm(formula = y ~ CountryCode, data = d)

Coefficients:
        (Intercept)  CountryCodeCountry2  
             0.9086              -0.4002  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      0.1685 
Residual Deviance: 0.008388     AIC: -7.317

系数 table 中的缺失因子水平是基线水平 - 在本例中 Country1

由于 R 对分类变量的默认(处理)对比使用第一个因子水平作为 baseline/intercept,选择基线水平的最简单方法是使用 relevel() 函数进行指定调平第一层(并将所有其他层向下移动一个位置)。按照@spacedman 的回答,即时进行:

glm(y~relevel(factor(country),"7"), data=d)

或:

d$CountryCode = relevel(factor(paste0("Country",d$country)), "Country7")