Как создать сюжет из вывода функции в R - PullRequest
0 голосов
/ 07 января 2020

У меня есть функция, которая вычисляет логарифмическую вероятность для вектора уровней экспрессии в генах (x); например, -0,465, 0,111, -0,437. Рассчитанное значение сигмы равно 0,4717 и a = 0,8861.

    loglike <- function(x,theta,sigma,a) {
      sum(log(theta/(2*a)*(x<a)*(x>-a) + (1- 
      theta)*dnorm(x,mean=0.0,sd=sigma)))
    }

Я хочу ввести в функцию вектор возможных значений для тета и построить результат функции с каждым значением для тета. Поэтому я подумал, что l oop будет вращаться по всем значениям тета в функции, чтобы создать список значений из выходов логоподобной функции. Затем создайте график тета на основе логоподобного результата.

   theta <- seq(0,1,0.01)  

   result_ <- c()
   for (i in 1:length(theta)) {
      result <- loglike(x,i,sigma,a)
      result_[i] <- result[i]
   }

Но это просто дает мне предупреждающие сообщения:

   Warning messages:
   1: In log(theta/(2 * a) * (x < a) * (x > -a) + (1 - theta) * 
   dnorm(x,  :
     NaNs produced

Я знаю, что функция работает, потому что когда я использую функцию один за один раз он возвращает значения, такие как

    loglike(x,0,sigma,a)
    > -333.454234

Я не очень уверен в R как языке, поэтому буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 07 января 2020

Спасибо за добавление значений x, a и sigma: это позволило мне найти вашу ошибку.

В этом l oop здесь:

  for (i in 1:length(theta)) {
      result <- loglike(x,i,sigma,a)
      result_[i] <- result[i]
   }

вы вводите i в качестве значения тета для лог-функции. Помните, i - это индекс l oop, который изменяется от 1 до 101, но вам нужно значение тета в каждом цикле l oop, поэтому оно должно быть theta[i].

Кроме того, поскольку ваша функция loglike возвращает только одно число, вы сохраняете одно число в result, но затем пытаетесь сохранить result[i] в result_[i]. Когда l oop проходит мимо i = 1, вы пытаетесь переместить несуществующее число.

Вот полный рабочий пример:

loglike <- function(x, theta, sigma, a)
{
  sum(log((theta / (2*a)) * (x < a) * (x > -a) +
          (1 - theta) * dnorm(x, mean = 0.0, sd = sigma)))
}

x       <-  0.111
sigma   <-  0.4717
a       <-  0.8861
theta   <- seq(0, 1, 0.01)
result  <- numeric()

for (i in 1:length(theta)) result[i] <- loglike(x, theta[i], sigma, a)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...