0

我编了一个例子来说明我的问题。想象一下,我有一个数据集,并且我训练了一个具有伽马分布残差的广义线性模型。

library(MASS)

df <- read.csv('test.csv')

model <- glm(formula = y ~ method * site + year + 0,
             family=Gamma(link = "log"), data = df)

我得到的东西看起来像这样:

> summary(model) 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
methodM0          3.89533    0.13670  28.496  < 2e-16 ***
methodM1          5.63965    0.20940  26.933  < 2e-16 ***
methodM2        -55.854107  73.982453  -0.755    0.450
methodM3        -55.731730  73.986509  -0.753    0.451
siteS1           -0.002872   0.098226  -0.029    0.977
siteS2            0.060892   0.107795   0.565    0.572
siteS3           -0.016239   0.102258  -0.159    0.874
year              0.030813   0.036743   0.839    0.402
methodM1:siteS1  -0.030616   0.144592  -0.212    0.832
methodM2:siteS1  -0.030632   0.144663  -0.212    0.832
methodM3:siteS1   0.064179   0.145593   0.441    0.659
methodM1:siteS2  -0.146505   0.152012  -0.964    0.335
methodM2:siteS2  -0.039610   0.148024  -0.268    0.789
methodM3:siteS2  -0.202881   0.150406  -1.349    0.178
methodM1:siteS3   NA         NA         NA       NA
methodM2:siteS3   0.081617   0.144040   0.567    0.571
methodM3:siteS3  -0.064155   0.147771  -0.434    0.664

该表是虚构数字的结果,但关键是我在方法 M1 和站点 S3 之间有一个交互,它给出NA. 如何将 GLM 设置为不计算该特定交互,在训练后删除该交互,或将模型中的那些 NA 值设置为0

更新

@jared_mamrot 给出的答案指出了这个非常相似的相关问题:

s <- source("http://pastebin.com/raw.php?i=EcMEVqUC")$value

lm(income ~ age + cit * prof, data=s)

这里lm而不是glm遵循,但我发现当我对相关问题运行接受的答案时,更新似乎甚至没有修复这个例子。

model1 <- lm(income ~ age + cit * prof, data=s)
model2 <- update(model1, . ~ . - citforeign:profofficial)

看着model1,我们有

> model1

Call:
lm(formula = income ~ age + cit * prof, data = s)

Coefficients:
               (Intercept)                         age                     citwest                  citforeign  
                  2205.231                      -3.825                      74.871                      30.066  
           profblue-collar                profofficial     citwest:profblue-collar  citforeign:profblue-collar  
                  -189.146                    -147.332                      27.792                     -60.223  
      citwest:profofficial     citforeign:profofficial  
                  -122.220                          NA

看着model2我们有同样的

> model1

Call:
lm(formula = income ~ age + cit * prof, data = s)

Coefficients:
               (Intercept)                         age                     citwest                  citforeign  
                  2205.231                      -3.825                      74.871                      30.066  
           profblue-collar                profofficial     citwest:profblue-collar  citforeign:profblue-collar  
                  -189.146                    -147.332                      27.792                     -60.223  
      citwest:profofficial     citforeign:profofficial  
                  -122.220                          NA

如您所见,update似乎没有删除NA.

4

1 回答 1

0

你能用update吗?例如

model1 <- glm(formula = y ~ method * site + year + 0,
             family=Gamma(link = "log"), data = df)
model2 <- update(model1, . ~ . - methodM1:siteS3)

(每从估计删除一些因素交互项/https://www.r-bloggers.com/using-the-update-function-during-variable-selection/ )

编辑

这是一种在从估计中删除一些因子交互项中update发布的示例数据上使用该方法的方法

s <- source("http://pastebin.com/raw.php?i=EcMEVqUC")$value
model1 <- glm(income ~ age + cit * prof, data=s)
model2 <- update(model1, . ~ . - cit:prof)
summary_glm(model1)
summary_glm(model2)

编辑 2

如果您不想使用更新,您可以尝试删除交互(见下文),但我不知道这将如何影响模型的有效性或是否可取。

s <- source("http://pastebin.com/raw.php?i=EcMEVqUC")$value
model1 <- glm(income ~ age + cit * prof, data=s)
model2 <- glm(income ~ model.matrix(model1)[,1:9], data=s)
summary_glm(model1)
summary_glm(model2)
于 2020-06-02T04:02:59.170 回答