2017-01-09 15 views
0

Я новичок в Stan и вероятностном программировании. Я пытаюсь построить нелинейную модель роста. Я был в состоянии построить модель в NLSПостроение нелинейной экспоненциальной модели - использование вектора или реального?

Формула NLS я использовал: Trump_Pct ~ alpha - beta * lambda^Population

Мое резюме NLS является:

Parameters: 
    Estimate Std. Error t value Pr(>|t|)  
alpha 5.627e+01 2.053e+00 27.41 <2e-16 *** 
beta 3.018e+01 1.974e+00 15.29 <2e-16 *** 
lambda 9.981e-01 2.486e-04 4014.47 <2e-16 *** 

Другими словами, основной экспоненциальной кривой затухания. Я пытаюсь повторить со Стэном.

Мои данные следующим образом:

У меня есть N наблюдения в наборе данных: Предсказатель является население округа («населения») и предсказанным Y является процент голосов в Trump «Trump_Pct».

Я пробовал два способа построения этой модели.

  1. В одном я передаю каждому компоненту данные в модель в виде вектора.

  2. В другом случае я оставляю каждый компонент данных в виде списка и пытаюсь использовать каждую точку данных.

Я не могу в любом случае, чтобы модель успешно работала.

Вот мои модели:

Случай 1:

Это адаптация this model.

Здесь я создал векторизованные версии столбцов Trump_Pct и Population.

data { 
    int N; 
    vector[N] PopulationV; 
    vector[N] Trump_PctV; 
} 
parameters { 
    vector [1] alpha; 
    vector [1] beta; 
    vector [1] lambda; 
    real<lower=0> sigma; 
} 
model { 
    vector[N] ypred; 
    ypred = alpha[1] - beta[1] * (lambda[1]^PopulationV); 
    Trump_PctV ~ ypred + sigma; 
} 

Эта модель не в соответствии с показателем по следующей причине:

`Синтаксическая ошибка, MESSAGE (S) ОТ PARSER:

аргументы^должны быть примитивным (реальный или ИНТ); не может быть экспоненциальным по вектору в блоке = местный

Я пробовал использовать pow(), но не могу найти способ двигаться вперед. Какие-нибудь советы?

Случай 2:

data { 
    int<lower=0> N; 
    real <lower=0> Population[N]; 
    real <lower=0> Trump_Pct[N]; 
} 
parameters { 
    real alpha; 
    real beta; 
    real<lower=3,upper= 4> lambda; 
    real<lower=0> tau; 
} 
transformed parameters { 
    real sigma; 
    sigma = 1/sqrt(tau); 
} 
model { 
    real m[N]; 
    for (i in 1:N) 
    m[i] = alpha - beta * pow(lambda, Population[i]); 

    Trump_Pct ~ normal(m, sigma); 

    alpha ~ normal(10, 20); 
    beta ~ normal(5, 10); 
    lambda ~ uniform(3, 4); 
    tau ~ gamma(.0001, .0001); 
} 

В случае 2, я не в состоянии держать оценки параметров в пределах:

"Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:"
[2] "Exception thrown at line 21: normal_log: Location parameter[2873] is -inf, but must be finite!"

Может кто-нибудь посоветовать для простого нелинейного модель моей формулы?

+1

Помещение 'lambda ~ uniform (3, 4);' в блок модели не требуется, потому что это подразумевается под «real lambda;'. Тем не менее, единообразные перья не рекомендуются в Стэне. То же самое можно сказать и для tau ~ gamma (.0001, .0001), которая почти однородна в широком диапазоне положительных вещественных чисел, но имеет очень резкую кривизну вблизи нуля. В Стэне есть рекомендации для авторов в https://github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations. Наконец, функция «brm» в пакете brms позволяет вам указать модель аналогично «nls». –

ответ

1

Ваш случай 2 является правильным синтаксисом. Как вы обнаружили, ни ^, ни pow входные векторы, поэтому вам нужно их пересечь.

Информационное сообщение, которое вы видите, связано с численным переполнением и не должно приводить к остановке сэмплера. Более подробно об этом сообщении here.

Вполне возможно, что пробник не может двигаться, в этом случае вы можете передать значение init_r в stan или sampling и установить init_r на значение меньше значения по умолчанию 2. Это влияет на ширину однородного интервала, из которого начальные значения рисуются в неограниченном пространстве.

Если есть много сообщений о переполнении, вполне возможно, что у вас есть и другие проблемы, такие как расходящиеся переходы, которые также рассматриваются в приведенной выше ссылке. Конечным решением, вероятно, является перемасштабирование данных, репараметризация модели и/или ужесточение приоритетов.

+0

Могу ли я спросить, почему случай 2 правильный? Вы правы, я не могу заставить пробоотборник ... попробует ваше решение. –

+0

Случай 2 является допустимым синтаксисом, тогда как случай 1 - нет. Все унарные функции можно вызывать на векторном входе, но не функции с двумя или более аргументами. –

 Смежные вопросы

  • Нет связанных вопросов^_^