2013-10-14 5 views
0

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

x = c(0.0000005, 0.1578947, 0.3157895, 0.4736842, 0.6315789, 0.7894737, 
     0.9473684, 1.1052632,1.2631579, 1.4210526, 1.5789474, 1.7368421, 
     1.8947368, 2.0526316, 2.2105263, 2.3684211, 2.5263158 , 
     2.6842105, 2.8421053, 3.000000)  
    f = function(x) (x+1)*(x-2)*(x-1)*(x)*(x+1)*(x-2)*(x-3) 
    plot(x, f(x), type="l") 
    maximums = sapply(x, function(x)optimize(f, c(0, x), maximum = TRUE)$maximum) 
+0

Это, кажется, дает вам правильный результат Если вы осмотрите 'maximums' , вы увидите, что он дает вам «0.46» и «2.00», как ваши максимумы, которые соответствуют вашему сюжету. – Ramnath

+0

да, конечно, но я хочу получить в конце только локальные максимумы, а не другие моменты. могу ли я избавиться от других? – rose

+0

ну, вы попросили его дать локальный максимум за каждый интервал, и это дает вам это. Чтобы убедиться, что это локальный пик, вам нужно будет проверить, является ли вторая производная отрицательной в смысл. – Ramnath

ответ

0

Я не уверен, как применять optimize в эту последовательность для этой цели, но это, конечно, не будет применяться точечно .. Вы, вероятно, можете сделать полиномиальный сплайн, а затем продифференцировать его. Численный аналог дифференцирования равен diff, а условия для локального максимума заключаются в том, что первая производная мала и вторая производная отрицательна. Вот сюжет условий, которые удовлетворяют те (сдвигая окраску одного объяснить укорочение вектора, когда вы diff это:.

plot(x,f(x), 
    col=c("red","blue")[1+seq_along(x) %in% # adding one to the logical values 0,1 
         c(0, which(diff(diff(f(x)))<0 & diff(f(x)) < 0.1))]) 
Смежные вопросы