如果每种治疗方法的n都不相同,请使用tapply

时间:2018-06-30 23:32:10

标签: r nls tapply

我是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)

当我显示回溯时,将显示以下步骤:

     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不相等这一事实上。例如,对于温度10、15、20、30,n = 58,165,113,26。相应的y值(Larvae_rate)与每个x值(Larvae_temp)匹配。有人知道如何解决这个问题吗?

如果有人可以查看我的代码并看是否有意义,我也将非常感谢!我对R还是很陌生,调试代码已经占据了我的一生。

请告知我是否可以提供更多信息。谢谢!

1 个答案:

答案 0 :(得分:1)

我已经编辑过,所以LarvaeDevelopment存在,我们可以重现您的问题。

简短答案:您的SSpower对象在其Initial函数中存在一些错误和不一致之处:不应使用全局数据对象,而应仅使用其参数,并且公式不应使用使用Larvae_temp,但使用x等。

您还引用了一个相对较旧版本的R(3.1.0)的基于tibco的镜像,其中R的当前版本在selfStart的帮助页面上进行了稍微更新。

我们确实需要另一位志愿者来重写您对SSpower的定义,但是请相信我在R-devel上给您的回答:当数字中的“元素”不同时,轻按即可起作用。破烂的数组! 例如,

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

显示3个和,分别是3和2和1个元素的8、8、5:

3 5 6 
8 8 5