2017-03-12 9 views
1

フィットカーブを滑らかにするには?より滑らかなカーブフィットプロットを作成できません

XY <- data.frame(cbind(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), 
      Concn = c(1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0))) 
nls.fit <- nls(Values ~ (ymax* Concn/(ec50 + Concn)) + Ns*XY$Concn + ymin, data=XY, 
        start=list(ymax=max(XY$Values), ymin = min(XY$Values), ec50 = 3, Ns = 0.2045514)) 
plot(XY$Values ~ XY$Concn , data = XY, col = 4, main = "XY Std curve", log = "x") 
lines(XY$Concn, predict(nls.fit)) 

私は次のスクリプトを試したときにエラーメッセージが表示されます。 (関数(数式、データ= NULLで

SmoothX <- seq(min(XY$Values), max(XY$Values), length = 100) 
lines(SmoothX, predict(nls.fit,SmoothX), col='red', lwd=2) 

エラー、サブセット= NULL、na.action = na.fail: 可変長)は、 'SmoothX' 見つかり(異なる

固定する方法?エラー

enter image description here

答えて

1

まずXYの時にすることを確実にするためにConcnの昇順にソートされていることを確認してくださいlinesを使用して、各点は次のソートされた点に接続され、他の点には接続されません。また、式のXYを削除してください。これはすでに引数dataに指定されているため問題があります。plotlinesの引数であるsubsetを0から除外するには、plotlinesの対数スケールを指定するため、plotlinesを使用します。

o <- order(XY$Concn) 
XY <- XY[o, ] 

fo <- Values ~ (ymax* Concn/(ec50 + Concn)) + Ns * Concn + ymin 
st <- list(ymax=max(XY$Values), ymin = min(XY$Values), ec50 = 3, Ns = 0.2045514) 
nls.fit <- nls(fo, data = XY, start = st) 

plot(Values ~ Concn, XY, subset = Concn > 0, col = 4, log = "x") 
title(main = "XY Std curve") 
lines(predict(nls.fit, new = list(Concn = Concn)) ~ Concn, XY, subset = Concn > 0) ## 

任意選択的に、それは均等対数スケール上の離間点をより多く提供するために、コードの次の3行で(上記##マーク)linesステートメントを置換することによってもスムーズ行うことができます。対数を取る前に0点を取り除くことに注意してください。行を省略

logRange <- with(XY, log(range(Concn[Concn > 0]))) 
x <- exp(seq(logRange[1], logRange[2], length = 100)) 
lines(x, predict(nls.fit, new = list(Concn = x))) 

はマーク##とし、我々が得る最後3行を含む、上記のコードの残りすべてを実行している:

screenshot

+0

ありがとうございました!私はあなたの指導に非常に感謝します。 – RanonKahn

1

まず私が予測に使用される新しいデータではなく、値の濃度を用いるべきであると思う:

SmoothX <- seq(min(XY$Concn), max(XY$Concn), length = 100) 

さらに、そのSmoothXを見て、予測(nls.fit、SmoothX)は長さが異なる:

str(SmoothX) 

NUM [1:100] 91.8 107.3 122.8 138.3 153.8 ...

str(predict(nls.fit,SmoothX)) 

num [1:12] 109.5 49 52.3 120.6 298.6 ...

しかし、list(Concn=SmoothX)を含めると、新しいデータベクトルの長さが100であるベクトルが得られます。

str(predict(nls.fit,list(Concn=SmoothX))) 

NUM [1:100] 1714 324.7 175.5 119.6 91.8 ...

これはうまく動作しますが、それはまだ、警告メッセージと悪い醜い赤い線与えます。c。

lines(SmoothX, predict(nls.fit,list(Concn=SmoothX)), col='red', lwd=2) 

警告メッセージ: で(YMAX * Concn /(EC 50 + Concn))+ Ns個* XY $ Concn: 長いオブジェクトの長さが短い物体長の倍数でない

Plot produced

+0

良い努力をするが、これは本当にOPを助けるのでしょうか? ? –

+0

プロット用に100個の値のベクトルを取得する方法を段階的に教えていただき、ありがとうございます。これは、私のような彼らの多くに非常に便利です。 – RanonKahn

1

まず第一に、あなたはそれにXY$なしnls()式を使用する必要があります。

nls.fit <- nls(Values ~ (ymax* Concn/(ec50 + Concn)) + 
         Ns*Concn + ymin, 
       data=XY, 
       start=list(ymax=max(XY$Values), ymin = min(XY$Values), 
          ec50 = 3, Ns = 0.2045514)) 

プロット:

plot(Values ~ Concn , data = XY, col = 4, main = "XY Std curve", 
    log = "x") 

あなたはそれが対数スケールで均等にあなたの予測値を広めるのに役立ちますログ-Xスケールでプロットするつもりなら。また、あなたのモデルで予測変数と同じ変数名(Conc)とのデータフレームであることを予測データを必要とする:

SmoothX <- with(XY, 
     data.frame(Concn=10^seq(min(log10(Concn[Concn>0])), 
           max(log10(Concn)), length = 100))) 
pp <- predict(nls.fit,SmoothX) 
lines(SmoothX$Concn, pp, col='red', lwd=2) 


plot(Values ~ Concn , data = XY, col = 4, main = "XY Std curve", 
    log = "x") 
SmoothX <- with(XY, 
     data.frame(Concn=10^seq(min(log10(Concn[Concn>0])), 
           max(log10(Concn)), length = 100))) 
pp <- predict(nls.fit,SmoothX) 
lines(SmoothX$Concn, pp, col='red', lwd=2) 
+0

ありがとう!私はあなたの指導に非常に感謝します。私はあなたの答えとG. Grothendieckの答えが同じように好きです。 G. Grothendieckの答えが最初の答えだったので、私はそれを選びました。ごめんなさい! – RanonKahn

関連する問題