Я не уверен, насколько это будет полезно, так как ваш Q немного более открыт, чем мы обычно хотели бы на SO, но здесь все в порядке.
Во-первых, я думаю, что это помогло бы подумать о моделировании переменной ответа, которая, как я полагаю, в настоящее время видна. Это будет непрерывная переменная, ограниченная 0 (возможно, данные никогда не достигнут нуля?), Которая предлагает моделировать данные как условно распределенные либо
- гамма (
family = Gamma(link = 'log')
) для видимости, которая никогда не принимает значение ноль.
- Твиди (
family = tw()
) для данных, которые имеют нули.
Альтернативным подходом было бы моделирование возникновения тумана; если это определено как событие <400м, то вы можете превратить все свои наблюдения в значения 0/1, чтобы они были явлением тумана или иным образом. Тогда вы бы смоделировали данные как условно распределенные Бернулли, используя <code>family = binomial().
Определившись с подходом моделирования, нам нужно смоделировать ответ. Это должно быть сделано с использованием подхода множественной регрессии с GAM, включающим несколько предикторов. Таким образом, вы можете оценить влияние каждой потенциальной переменной предиктора на ответ, одновременно контролируя влияние других предикторов. Если вы просто делаете это, используя один предиктор за раз, скажем, dewpoint
, эта переменная вполне может «объяснить» изменение в данных, которое может быть связано с другим предиктором, скажем, windspeed
, и вы об этом не узнаете.
Кроме того, вполне возможно взаимодействие между предикторами, которые вы захотите контролировать, если они существуют, что может быть сделано только в
Затем, чтобы, наконец, разобраться в сути вашей проблемы, применив модель с несколькими предикторами для «объяснения» видимости, вам нужно будет сделать прогноз на основе этой модели для наборов вероятных условий. Чтобы посмотреть, как видимость меняется с dewpoint
в модели, где другие переменные-предикторы оказывают влияние, вам нужно зафиксировать другие переменные в некоторых разумных значениях; один из вариантов - установить для них среднее значение (или модальное значение в случае любых переменных-предикторов фактора) или другое значение, указывающее типичные значения для этой переменной. Для этого вам придется использовать свои знания предметной области.
Если у вас есть взаимодействия в модели, вам нужно будет изменить две переменные во взаимодействии, в то же время удерживая все остальные переменные фиксированными в некоторых значениях.
Предположим, у вас нет взаимодействий и вас интересует dewpoint
, но модель также включает windspeed
. Средняя скорость ветра для значений, используемых для подгонки модели, может быть найдена из компонента cmX
подгонянной модели. Из вас можно просто рассчитать это по наблюдаемым windpseed
значениям или установить для некоторого известного числа, которое вы хотите использовать. Обозначим подогнанный m
, а фрейм данных с вашими данными в нем df
, тогда мы можем создать новые данные для прогнозирования в диапазоне dewpoint
, при этом удерживая windspeed
фиксированным.
mn.windspd <- m$cmX['windspeed']
## or
mn.windspd <- with(df, mean(windspeed))
## or set it some some value
mn.windspd <- 10 # say
Тогда вы можете сделать
preddata <- with(df,
expand.grid(dewpoint = seq(min(dewpoint),
max(dewpoint),
length = 300),
windspeed = mn.windspd))
Затем вы используете это, чтобы предсказать из подобранной модели:
pred <- predict(m, newdata = preddata, type = "link", se.fit = TRUE)
pred <- as.data.frame(pred)
Теперь мы хотим вернуть эти прогнозы обратно в шкалу ответов, и нам нужен доверительный интервал, поэтому мы должны сначала создать его перед обратным преобразованием:
ilink <- family(m)$linkinv
pred <- transform(pred,
Fitted = ilink(fit),
Upper = ilink(fit + (2 * se.fit)),
Lower = ilink(fit - (2 * se.fit)),
dewpoint = preddata = dewpoint)
Теперь вы можете визуализировать влияние dewpoint
на ответ, сохраняя windspeed
фиксированным.
В вашем случае вам придется расширить это, чтобы сохранить temperature
константу также, но это делается таким же образом
mn.windspd <- m$cmX['windspeed']
mn.temp <- m$cmX['temperature']
preddata <- with(df,
expand.grid(dewpoint = seq(min(dewpoint),
max(dewpoint),
length = 300),
windspeed = mn.windspd,
temperature = mn.temp))
и затем выполните действия, описанные выше, чтобы сделать прогноз.
Для одной или двух переменных меняюсь, у меня есть функция data_slice()
в моем пакете gratia , которая сделает для вас вышеуказанные expand.grid()
вещи, так что вам не нужно указывать средние значения другие ковариаты:
preddata <- data_slice(m, 'dewpoint', n = 300)
технически это находит значение в данных, ближайших к срединному значению (для ковариат не меняется). Если ты хочешь средства, то делай
fixdf <- data.frame(windspeed = mn.windspd, temperature = mn.temp)
preddata <- data_slice(m, 'dewpoint', data = fixdf, n = 300)
Если у вас есть взаимодействие, скажем, между dewpoint
и windspeed
, тогда вам нужно варьировать две переменные. Это довольно легко снова с expand.grid()
:
mn.temp <- m$cmX['temperature']
preddata <- with(df,
expand.grid(dewpoint = seq(min(dewpoint),
max(dewpoint),
length = 100),
windspeed = seq(min(windspeed),
max(windspeed),
length = 300),
temperature = mn.temp))
Это создаст сетку значений ковариат 100 × 100 для прогнозирования, в то же время поддерживая постоянную температуру.
Для data_slice()
вам нужно сделать:
fixdf <- data.frame(temperature = mn.temp)
preddata <- data_slice(m, 'dewpoint', 'windpseed',
data = fixdf, n = 300)
И распространяя это на большее число ковариат, которые вы хотите варьировать, также легко следовать этому шаблону с expand.grid()
; Мне еще предстоит реализовать более 2 переменных, различающихся по data_slice
.