5

治療ごとにグループ化された多数のデータセットに曲線を当てはめたいと思います。これは nlslist で非常にうまく機能していましたが、ここでパラメーターに上限を導入したいと思います。

境界の導入は、各グループを nls で個別に適合させると非常にうまく機能しますが、nlslist で作業をスピードアップしたい場合 (もっと多くのデータセットがあります) にはうまくいきません。

これを解決する方法を教えてください。

私のデータセットの例:

DF1<-data.frame(treatment = rep(c("mineral","residues"),4),
            N_level = c(0,0,100,100,200,200,300,300),
            yield = c(8,8.5,10,10.5,11,9.8,9.5,9.7))

DF1

    treatment N_level yield
1   mineral       0   8.0
2  residues       0   8.5
3   mineral     100  10.0
4  residues     100  10.5
5   mineral     200  11.0
6  residues     200   9.8
7   mineral     300   9.5
8  residues     300   9.7

このデータセットを nls のみで適合させようとするとうまくいきます。

fit_mineral <- nls(formula = yield ~ a + b*0.99^N_level +c*N_level, 
                data=subset(DF1, subset = treatment == "mineral"), 
                algorithm = "port", start = list(a = 12, b = -8, c= -0.01), 
                upper = list(a=1000, b=-0.000001, c=-0.000001))

フィットミネラル

Nonlinear regression model
model: yield ~ a + b * 0.99^N_level + c * N_level
data: subset(DF1, subset = treatment == "mineral")
    a       b       c 
13.7882 -5.8685 -0.0126 
residual sum-of-squares: 0.4679

しかし、nlslist で何かを結合しようとすると、うまくいきません:

fit_mineral_and_residues <- nlsList(model = yield ~ a + b*0.99^N_level +c*N_level 
                      | treatment, data=DF1, 
                      algorithm = "port", start = list(a = 12, b = -8, c= -0.01), 
                      upper = list(a=1000, b=-0.000001, c=-0.000001))

エラーメッセージ:

Error in nlsList(model = yield ~ a + b * 0.99^N_level + c * N_level |  : 
unused arguments (algorithm = "port", upper = list(a = 1000, b = -1e-06, c = -1e-06))
4

2 に答える 2

3

同じ問題に遭遇しました。この問題は、ソース コード レベルで修正する必要があると思います。

nlsList回避策として、おそらくオブジェクトを自分で構築しようとすることができます。

library(nlme)
DF1=data.frame(treatment = rep(c("mineral","residues"),4),
               N_level = c(0,0,100,100,200,200,300,300),
               yield = c(8,8.5,10,10.5,11,9.8,9.5,9.7))
nlslist=lapply(unique(DF1$treatment),function(i) {datasubs=DF1[DF1$treatment==i,];
                                                             nls(yield ~ a + b*0.99^N_level +c*N_level, 
                                                                 data=datasubs, 
                                                                 start = list(a = 12, b = -8, c= -0.01), 
                                                                 upper = list(a=1000, b=-0.000001, c=-0.000001), 
                                                                 algorithm="port", 
                                                                 control=list(maxit=100000,tol=1e-10,warnOnly=T,minFactor=1e-10) )
                                                  })
names(nlslist)=unique(DF1$treatment)
attr(nlslist, "dims")=list(N = nrow(DF1), M = length(nlslist))
attr(nlslist, "call")=NA # this line is not correct - should be fixed
attr(nlslist,"groups")=names(nlslist)
attr(nlslist, "origOrder")=1:length(unique(DF1$treatment))
attr(nlslist, "pool")=TRUE
attr(nlslist, "groupsForm")=formula(~treatment)
class(nlslist)=c("nlsList", "lmList")

スロットを正しく埋める方法がよくわからないことを除いて、これでほとんどそこにたどり着きます"call"(スロットnlsListを使用して構築されてmatch.call()います-これを行う方法を知っている人は誰ですか?

正しい構造を確認したい場合は、次のように確認できます。

test=nlsList(uptake ~ SSasympOff(conc, Asym, lrc, c0),
               data = CO2, start = c(Asym = 30, lrc = -4.5, c0 = 52))
class(test)=NULL
test
于 2014-12-23T20:29:08.150 に答える
1

回避策を作成するためのトムの提案を調整して、次のコードを使用しています。

DF2 <- lapply(unique(DF1$treatment),function(i) {datasubs=DF1[DF1$treatment==i,];
                                              coef(nls(yield ~ a + b*0.99^N_level +c*N_level, 
                                                  data=datasubs, 
                                                  start = list(a = 12, b = -8, c= -0.01), 
                                                  upper = list(a=1000, b=-0.000001, c=-0.000001), 
                                                  algorithm="port", 
                                                  control=list(maxit=100000,tol=1e-10,warnOnly=T,minFactor=1e-10)))
})

DF2 <- data.frame(DF2)
names(DF2) <- levels(DF1$treatment)
DF2 <- t(DF2)
DF2

これにより、フィットの係数が得られます。

                a         b           c
mineral  13.78825 -5.868506 -0.01260393
residues 12.76157 -4.201832 -0.01006236

現時点では、より大きなデータセットでも十分に機能します。

于 2015-01-07T13:01:55.963 に答える