неожиданно = в пар=с()

Я пытаюсь воспроизвести следующий код (функция nls не работает должным образом), но с дополнительной реализацией, использующей циклы for, sprintf и as.formula(), которые добавляют переменные в зависимости от количества пиков в заданном спектре. Чтобы быть более последовательным среди пиков, я векторизовал имена переменных для каждого пика, поэтому пик номер 1 имеет связанные с ним «альфа [1]», «пик [1]» и «высота [1]».

Пока что я получил ожидаемую формулу:

height[1]/(pi*alfa[1]*(1+((x-peak[1])/alfa[1])^2))+height[2]/(pi*alfa[2]*(1+((x-peak[2])/alfa[2])^2))+drift.a+drift.b*x

Тем не менее, у меня возникают некоторые проблемы, когда я пытаюсь воспроизвести ту же систему для линии par. Это должно показать:

par=c(alfa[1]=0.001,
      peak[1]=2.156460,
      height[1]=1,
      alfa[2]=0.001,
      peak[2]=2.170150,
      height[2]=1, 
      drift.a=0, 
      driftb=0)

Но вместо этого, когда я свернул все строки и впоследствии использовал команду as.formula, я получил:

Error en parse(text = x) : <text>:1:15: unexpected '='
1: par=c( alfa[1]=
                  ^

Если я напечатаю свернутую строку, строка символов будет ожидаемой, поэтому я думаю, что она будет каким-то образом связана с командой as.formula (т.е. это может быть не соответствующая команда)


person user3032330    schedule 30.01.2014    source источник
comment
Добавьте имена отдельно, т.е. par <- c(0.001, 2.15646,...); names(par) <- c(alfa[1], peak[1],...).   -  person Jake Burkhead    schedule 30.01.2014
comment
При всем уважении к Дж. Ховарду я бы предложил не использовать par в качестве имени переменной, так как это может конфликтовать с графической функцией par . Но в любом случае, я подозреваю, что проблема заключается в попытке создать имена типа alfa[1], поскольку R пытается найти первый элемент объекта alpha. Если вы просто напишете par=c(alfa1=1,peak1=2,..., это, вероятно, будет хорошо проанализировано.   -  person Carl Witthoft    schedule 30.01.2014


Ответы (2)


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

Хорошо:

c(alfa1 = 0.001)
## alfa1 
## 0.001

alfa[1] не является допустимым именем переменной, это первый элемент переменной, поэтому вы должны заключить его в кавычки:

c(alfa1[1] = 0.001)
## Error: unexpected '=' in "c(alfa1[1] ="

c("alfa1[1]" = 0.001)
## alfa1[1] 
##    0.001

Также работают обратные кавычки:

c(`alfa1[1]` = 0.001)
## alfa1[1] 
##    0.001

См. также is_valid_variable_name в пакете assertive.

library(assertive)
is_valid_variable_name(c("alfa1", "alfa[1]"))
##   alfa1 alfa[1] 
##    TRUE   FALSE

Вы можете превратить имена ваших коэффициентов в действительные имена переменных, используя make.names:

make.names("alfa[1]")
## [1] "alfa.1."
person Richie Cotton    schedule 30.01.2014
comment
Когда я сворачиваю строки, я получаю: par=c('alfa[1]'=0.001,'peak[1]'=2.156460,'height[1]'=1,'alfa[2]'=0.001,'peak [2]'=2.170150,'height[2]'=1 ,drift.a=0,drift.b=0), но когда я после этого использую команду as.formula, она сообщает об этой ошибке: Ошибка в формуле.default( eval(parse(text = x)[[1L]])) : неверная формула. - person user3032330; 30.01.2014
comment
Ричи, хорошо объяснил, но я боюсь за голову ОП. - person Carl Witthoft; 30.01.2014
comment
Я не знаю, как вы сворачиваете строки, но, прочитав ответ jlhoward на другой ваш вопрос, я думаю, вы хотите make.names(names(coef(nls.out))). - person Richie Cotton; 30.01.2014

Вы хотите иметь векторы типа alfa и т. д. для хранения нескольких значений, если я правильно вас понимаю. Возможно, стоит попробовать объединить эти векторы в список, это сделает их более доступными.

И было бы неплохо назвать этот список не par.

Насколько я понимаю ваш вопрос, у вас есть более одного пика для обработки. Итак, у вас есть такие данные, как:

peak <- c(2.31, 3.17, ...)
alfa <- c(0.001, 0.002, ...)

В этом случае вы можете использовать list(peak = peak, ...) для создания списка со всеми вашими параметрами, а затем вызвать свою функцию и предоставить соответствующие объекты из списка.

Или я не понял суть вашего вопроса?

person r_chemist    schedule 30.01.2014
comment
Вы имеете в виду: константный‹-список (альфа [1], пик [1], высота [1] ...) и после этого «пар = с (константа)»? - person user3032330; 30.01.2014