Я пытаюсь приспособить обобщенную линейную модель к моим данным. Я собрал пыльцу из воздуха в течение двух (неравных) временных интервалов: дневной (9 часов) и ночной (15 часов) и определил пыльцу как вишня, другие покрытосеменные и другие голосеменные, исходя из морфологических характеристик.
Когда я смотрю на необработанные данные, наблюдаются некоторые интересные тенденции количества пыльцы вишни в воздухе ночью по сравнению с днем, и эти различия довольно сильно различаются в двух садах, которые я пробовал. Я хочу измерить, как временной интервал влияет на мою модель.
Мои проблемы (неполный список: p)
1) Я не понимаю, почему термин Интервал продолжает давать мне значение 1 для Pr (> | z |).
2) Я не знаю, как объяснить неравные промежутки времени.
Я пробовал этот glm с двумя распределениями ошибок: пуассоновским и биномиальным, в зависимости от формата переменной ответа.
Вот подвыборка моих данных:
Orchard <- c("CSO", "CSO", "CSO", "HBA", "HBA", "HBA")
Interval <- c("AM", "AM", "AM", "PM", "PM", "PM")
Interval.Duration <- c(9,9,9,15,15,15)
PollenType <- c("Cherry", "Other angiosperm", "Other gymnosperm")
Count <- c(0,2,11,245,124,5,0,2,19,80,38,0,1,0,3,200,150,1)
TotalCount <- c(13,13,13,374,374,374,21,21,21,118,118,118,4,4,4,351,351,351)
df <- data.frame(Orchard, Interval, Interval.Duration, PollenType, Count, TotalCount)
df
# Poisson error distribution model
mod <- glm(Count ~ PollenType + Interval + offset(log(TotalCount)), data = df, family = poisson)
summary(mod)
Call:
glm(formula = Count ~ PollenType + Interval + offset(log(TotalCount)),
family = poisson, data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-5.0076 -3.0242 -0.9525 1.3507 8.8612
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -5.158e-01 1.646e-01 -3.134 0.00172 **
PollenTypeOther angiosperm -5.096e-01 7.117e-02 -7.159 8.1e-13 ***
PollenTypeOther gymnosperm -2.602e+00 1.660e-01 -15.677 < 2e-16 ***
IntervalPM -1.532e-14 1.658e-01 0.000 1.00000
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for poisson family taken to be 1)
Null deviance: 742.63 on 17 degrees of freedom
Residual deviance: 240.61 on 14 degrees of freedom
AIC: 313.04
Number of Fisher Scoring iterations: 7
# Binomial error distribution model
mod.bin <- glm(Count/TotalCount ~ PollenType + Interval, data = df, family = binomial)
summary(mod.bin)
Call:
glm(formula = Count/TotalCount ~ PollenType + Interval, family = binomial,
data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.04298 -0.88408 0.03032 0.56505 1.02296
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -5.805e-01 9.912e-01 -0.586 0.558
PollenTypeOther angiosperm -6.754e-01 1.300e+00 -0.519 0.603
PollenTypeOther gymnosperm 2.558e-01 1.187e+00 0.216 0.829
IntervalPM 7.973e-14 1.016e+00 0.000 1.000
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 9.7044 on 17 degrees of freedom
Residual deviance: 9.1325 on 14 degrees of freedom
AIC: 28.299
Number of Fisher Scoring iterations: 4
Вывод 1 для Interval говорит мне, что я сделал что-то не так или что я не задаю свой вопрос должным образом в glm.
Я подозреваю, что проблема может быть связана с форматированием моего набора данных, но я действительно не знаю, с чего начать.
~~ РЕДАКТИРОВАТЬ ~~
Спасибо @ Eric-Scott за подробный отзыв. Я переработал фиктивные данные, чтобы они отражали только количество вишен, и сделал подмножества для каждого сада, потому что не думаю, что имеет смысл включать данные из обоих садов в одну модель. Я использовал «Interval.Duration» в качестве смещения, как вы рекомендовали.
Orchard <- c("HBA", "CSO")
Interval <- c("AM", "AM", "PM","PM")
Interval.Duration <- c(9,15)
Count <- c(13,4,245,0,80,2,98,1,200,1,530,1,196,2,311,1)
TotalCount <- c(38,7,374,21,118,15,144,4,351,10,884,12,338,34,490,15)
df <- data.frame(Orchard, Interval, Interval.Duration, Count, TotalCount)
df
df.H <- subset(df, Orchard == "HBA")
df.C <- subset(df, Orchard == "CSO")
#HBA data
modH <- glm(Count ~ Interval + offset(log(Interval.Duration)), data = df.H, family = quasipoisson)
Call:
glm(formula = Count ~ Interval + offset(log(Interval.Duration)),
family = quasipoisson, data = df.H)
Deviance Residuals:
Min 1Q Median 3Q Max
-13.392 -6.225 -1.096 6.204 12.226
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.6088 0.4263 6.120 0.000869 ***
IntervalPM 0.8843 0.5067 1.745 0.131574
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for quasipoisson family taken to be 88.85893)
Null deviance: 892.38 on 7 degrees of freedom
Residual deviance: 594.73 on 6 degrees of freedom
AIC: NA
Number of Fisher Scoring iterations: 5
#CSO data
modC <- glm(Count ~ Interval + offset(log(Interval.Duration)), data = df.C, family = quasipoisson)
Call:
glm(formula = Count ~ Interval + offset(log(Interval.Duration)),
family = quasipoisson, data = df.C)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.22474 -0.36170 0.05231 0.27453 1.05020
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.8971 0.2400 -7.904 0.000218 ***
IntervalPM -1.0986 0.4801 -2.289 0.062070 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for quasipoisson family taken to be 0.5185185)
Null deviance: 6.9044 on 7 degrees of freedom
Residual deviance: 3.7649 on 6 degrees of freedom
AIC: NA
Number of Fisher Scoring iterations: 5
Используя фиктивные данные, я вижу избыточную дисперсию и недостаточную дисперсию в моделях «HBA» и «CSO» соответственно (хотя, когда я запускаю модель на полном наборе данных, в обоих случаях наблюдается избыточная дисперсия).
Во-первых, я подгоняю модель с отрицательным биномиальным распределением, так как знаю, что модель с нулевым раздувом не поможет с избыточной дисперсией в наборе данных HBA (нулей нет).
library(MASS)
mod.NB <- glm.nb(formula = Count ~ Interval + offset(log(Interval.Duration)), data = df)
summary(mod.NB)
Call:
glm.nb(formula = Count ~ Interval + offset(log(Interval.Duration)),
data = df, init.theta = 0.2822584211, link = log)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.9557 -1.4501 -0.8920 0.3307 0.8569
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.9258 0.6667 2.889 0.00387 **
IntervalPM 0.8753 0.9423 0.929 0.35294
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for Negative Binomial(0.2823) family taken to be 1)
Null deviance: 21.300 on 15 degrees of freedom
Residual deviance: 20.463 on 14 degrees of freedom
AIC: 166.75
Number of Fisher Scoring iterations: 1
Theta: 0.2823
Std. Err.: 0.0836
2 x log-likelihood: -160.7510
Следуя советам возводить в степень коэффициенты из https://rpubs.com/kaz_yos/pscl-2 Я "возводил в степень" (это слово?) Коэффициенты из моей модели:
exp(coef(mod.NB))
(Intercept) IntervalPM
6.860548 2.399691
Если я правильно интерпретирую этот вывод, среднее число пыльцевых зерен вишни составляет 6,86, а ночью пыльца вишневого дерева в 2,4 раза больше. Статистически, однако, увеличение пыльцы в ночное время не является статистически большим, чем в течение дня. (NB: потерпите меня, большая часть моего замешательства связана с интерпретацией результатов).
Я запустил модель с нулевым раздуванием, чтобы справиться с беспорядком нулей в наборе данных "CSO", но мне также не ясно, как интерпретировать результаты здесь.
library(pscl)
#HBA data set
modzH <- zeroinfl(formula = Count ~ Interval, data = df.H, dist = "negbin")
В наборе данных HBA нет нулей, поэтому появляется следующая ошибка (отсюда и вышеупомянутый NegBin glm).
Error in zeroinfl(formula = Count ~ Interval, data = df.H, dist = "negbin") :
недопустимая зависимая переменная, минимальное число не равно нулю
#CSO data
modzC <- zeroinfl(formula = Count ~ Interval, data = df.C, dist = "negbin")
summary(modzC)
Call:
zeroinfl(formula = Count ~ Interval + offset(log(Interval.Duration)), data = df.C,
dist = "negbin")
Pearson residuals:
Min 1Q Median 3Q Max
-0.8660 -0.3333 0.0610 0.2887 1.1666
Count model coefficients (negbin with log link):
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.8971 0.3333 -5.691 1.26e-08 ***
IntervalPM -1.0986 0.6667 -1.648 0.0994 .
Log(theta) 13.6976 510.5736 0.027 0.9786
Zero-inflation model coefficients (binomial with logit link):
Estimate Std. Error z value Pr(>|z|)
(Intercept) -28.49 198393.43 0 1
IntervalPM 12.25 198394.44 0 1
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Theta = 888750.384
Number of iterations in BFGS optimization: 23
Log-likelihood: -10.13 on 5 Df
По совету Ferran Paüls Vergés Я снова возводил в степень коэффициенты из модели. (Это потому, что выходные данные модели дают коэффициенты в лог-коэффициентах?)
## Exponentiated coefficients
expCoef <- exp(coef((modzC)))
expCoef
# count_(Intercept) count_IntervalPM zero_(Intercept) zero_IntervalPM
# 1.500015e-01 3.333271e-01 4.234422e-13 2.092359e+05
И (если я понимаю, как их применять) базовое число пыльцы вишни в образце, в котором содержится пыльца, составляет 1,500015e-01, а шансы базовой линии образца, имеющего ноль зерен пыльцы вишни, составляют 4,234422e-13? Я действительно не уверен в этом предложении, оно не имеет смысла.