Использование tapply, когда у вас разные n для каждого лечения - PullRequest
0 голосов
/ 01 июля 2018

Я начинающий R и пытаюсь подогнать мои данные к нелинейной регрессии. В частности, я хочу, чтобы скорость развития насекомых при разных температурах соответствовала степенной функции. Ниже приведен мой код, модифицированный из примеров внизу этой страницы: https://docs.tibco.com/pub/enterprise-runtime-for-R/3.1.0/doc/html/Language_Reference/stats/selfStart.html

Вы должны быть в состоянии вставить код ниже прямо в R, чтобы получить то, что я получаю.

LarvaeDevelopment <- structure(list(Larvae_temp = c(10L, 10L, 10L, 10L, 10L, 10L), 
Larvae_rate = c(0.047757234, 0.04174518, 0.04174518, 0.04174518, 0.04174518, 0.04174518)), .Names = c("Larvae_temp", "Larvae_rate"), row.names = c(NA, 6L), class = "data.frame")


    SSpower<-(selfStart(~A*(Larvae_temp^B),
                initial=function(mCall,data,LHS)
                {xy<-sortedXyData(mCall[["Larvae_temp"]],mCall[["Larvae_rate"]],LarvaeDevelopment) ##I think the error appears in this line of code, or the one below
                z<-xy[["Larvae_rate"]]
                aux<-coef(lm(Larvae_temp~z,LarvaeDevelopment))
                pars<-as.vector(coef(nls(Larvae_rate~A*(Larvae_temp^B))),start=list(A=aux[1],B=aux[2]),data=LarvaeDevelopment,algorithm="power")
                value<-list(pars[1],pars[2])
                names(value)<-mCall[c("A","B")]
                value},
                parameters=c("A","B")))
    getInitial(Larvae_rate ~ SSpower(Larvae_temp, A, B), data=LarvaeDevelopment)

Когда я показываю traceback, появляются следующие шаги:

     Error in tapply(y, x, mean, na.rm = TRUE) : arguments must have same length 
    9. stop("arguments must have same length") 
    8. tapply(y, x, mean, na.rm = TRUE) 
    7. sortedXyData.default(mCall[["Larvae_temp"]], mCall[["Larvae_rate"]], 
LarvaeDevelopment) 
    6. sortedXyData(mCall[["Larvae_temp"]], mCall[["Larvae_rate"]], 
LarvaeDevelopment) 
    5. (attr(object, "initial"))(mCall = mCall, data = data, LHS = LHS) 
    4. getInitial.selfStart(func, data, mCall = as.list(match.call(func, 
call = object[[3L]])), LHS = object[[2L]], ...) 
    3. getInitial(func, data, mCall = as.list(match.call(func, call = object[[3L]])), 
LHS = object[[2L]], ...) 
    2. getInitial.formula(Larvae_rate ~ SSpower(Larvae_temp, A, B), 
data = LarvaeDevelopment) 
    1. getInitial(Larvae_rate ~ SSpower(Larvae_temp, A, B), data = LarvaeDevelopment) 

Я думаю, что проблема может быть связана с тем фактом, что n каждой процедуры неравны. Например, n = 58,165,113,26 для температур 10, 15, 20, 30. Соответствующие значения y (Larvae_rate) соответствуют каждому значению x (Larvae_temp). Кто-нибудь знает, как это исправить?

Я также был бы очень признателен, если бы кто-то мог просмотреть мой код и посмотреть, имеет ли он смысл! Я все еще новичок в R, и отладка этого кода заняла всю мою жизнь.

Пожалуйста, дайте мне знать, если я могу предоставить больше информации. Спасибо !!

1 Ответ

0 голосов
/ 09 июля 2018

Я редактировал, так что теперь LarvaeDevelopment существует, и мы можем воспроизвести вашу проблему.

Краткий ответ: Ваш объект SSpower имеет несколько ошибок и несоответствий в своей функции Initial: должен не использовать ваш объект глобальных данных, а только его аргументы, а формула не должна использовать Larvae_temp но x и т. д. и т. п.

Также вы ссылаетесь на зеркало на основе Tibco относительно старой версии R (3.1.0), где текущие версии R имеют слегка обновленную страницу справки для selfStart.

Нам нужен еще один доброволец для переписывания вашего определения SSpower, но поверьте, что я ответил вам на R-devel: tapply работает , когда число «элементов» отличается в рваном массиве! Например.,

grps <- as.factor(c(3,5,3,3,6:5))
tapply(1:6, grps, sum)

показывает 3 суммы, 8,8,5 из 3 и 2 и 1 элемента соответственно:

3 5 6 
8 8 5 
...