Отрицательное логарифмическое правдоподобие для цензурированных данных - PullRequest
0 голосов
/ 23 сентября 2019

Я хотел бы использовать отрицательную логарифмическую вероятность в качестве целевой функции для моделирования примерно гауссовых данных с правильной цензурой.Моя целевая функция будет выглядеть примерно так, но я не уверен, как определить стандартное отклонение, используемое для расчета.Обычно мы просто минимизируем RMSE для максимальной вероятности Гаусса, а стандартное отклонение сводится к некоторой константе, которую мы можем спокойно игнорировать.При расчете вероятности с цензурированными данными с использованием 1 - CDF не ясно, что стандартное отклонение не имеет значения.Безопасно ли здесь просто использовать стандартное отклонение переменной отклика в качестве стандартного отклонения?

Я действительно не хочу моделировать, используя индекс соответствия, и я предпочел бы использовать непараметрические методы, а нечем простые модели пропорциональных рисков Кокса.

import numpy as np
from scipy.stats import norm
def censored_nll(event, value, prediction, std_dev):
    if event:
        return -np.log(norm.pdf(value, prediction, std_dev))
    return -np.log(norm.sf(value, prediction, std_dev))

1 Ответ

0 голосов
/ 24 сентября 2019

Безопасно ли здесь просто использовать стандартное отклонение переменной отклика в качестве стандартного отклонения?

Определенно нет, наблюдаемое распределение не подходит для вычисления сводной статистики из-заправильные цензурные точки данных.

Вы должны вычислить MLE численно как для среднего значения, так и для стандартного отклонения.Ваш код находится на полпути, но позвольте мне помочь вам:

import numpy as np
from scipy.stats import norm

def censored_nll(params, events, durations):
    mu, std_dev = params
    observed_durations = durations[events==1] # or events==True
    censored_durations = durations[~(events==1)] # or events==True
    return -(np.log(norm.pdf(observed_durations, loc=mu, scale=std_dev)).sum() \
             + np.log(norm.sf(censored_durations, loc=mu, scale=std_dev)).sum())

scipy.optimize.minimize(censored_nll, x0=np.array([0,1]), args=(events, durations))

...