2015-10-06 25 views
1

我有一個數據幀df計算模型效率離開一個被攝體出模式中的R

structure(list(x = c(49, 50, 51, 52, 53, 54, 55, 56, 1, 2, 3, 
    4, 5, 14, 15, 16, 17, 163, 164, 165, 153, 154, 72, 38, 39, 40, 
    23, 13, 14, 15, 5, 6, 74, 75, 76, 77, 78, 79, 80, 81, 82, 127, 
    128, 129, 130, 131, 132, 71, 72, 73, 74, 75, 76, 2, 3, 4, 5, 
    6, 99, 100, 101, 10, 11, 3, 30, 50, 51, 52, 53, 54, 56, 64, 66, 
    67, 68, 69, 34, 35, 37, 39, 2, 46, 47, 17, 18, 99, 100, 102, 
    103, 84, 85, 86, 87, 88, 67, 70, 72), y = c(2268.14043972082, 
    2147.62290922552, 2269.1387550775, 2247.31983098201, 1903.39138268307, 
    2174.78291538358, 2359.51909126411, 2488.39004804939, 212.851575751527, 
    461.398994384333, 567.150629704352, 781.775113821961, 918.303706148872, 
    1107.37695799186, 1160.80594193377, 1412.61328924168, 1689.48879626486, 
    685.154353165934, 574.088067465695, 650.30821636616, 494.185166497016, 
    436.312162090908, 641.231373456365, 494.374217984441, 201.745910386788, 
    486.030122926459, 483.045965372879, 265.693628564011, 285.116345260642, 
    291.023782284086, 229.606221692753, 230.952761338012, 1089.06303295676, 
    1255.88808925333, 1087.75402177912, 1068.248897182, 1212.17254891642, 
    884.222588171535, 938.887718005513, 863.582247020735, 1065.91969416523, 
    790.570635510725, 834.500908313203, 710.755041345197, 814.002362551197, 
    726.814950022846, 828.559687148314, 611.564698476112, 603.238720579422, 
    524.322001078981, 565.296378873638, 532.431853589369, 597.174114277044, 
    260.737164468854, 306.72700499362, 283.410379620422, 366.813913489692, 
    387.570173754128, 606.075737104722, 686.408686154056, 705.914347674276, 
    388.602676983443, 477.858510450125, 128.198042456082, 535.519377609133, 
    1893.38468471169, 1819.83262739703, 1827.31409981102, 1640.5816780664, 
    1689.0365549922, 2112.67917439342, 1028.8780498564, 1098.54431357711, 
    1265.26965941035, 1129.58344809909, 820.922447928053, 749.343583476846, 
    779.678206156474, 646.575242339517, 733.953282899613, 461.156280127354, 
    1184.81825619942, 1281.2920902365, 906.813018662913, 798.186995701282, 
    831.365377249207, 764.519073183124, 672.076289062505, 669.879217186302, 
    1265.48484068702, 1193.29000986667, 1156.81486114406, 1199.7373066445, 
    1116.24029749935, 1341.47673353751, 1401.44881976186, 1640.27575962036 
    ), ID = 1:97), .Names = c("x", "y", "ID"), row.names = c(NA, 
    -97L), class = "data.frame") 

我現在要基於一個交叉驗證來計算一個非線性模型的模型效率離開一個ID出。我實現了這一行代碼。

library(stats) 
library (hydroGOF) 

id <- unique(df$ID) 
for (i in id){ 
    fit1 <- try(nls(y~A*x^3+B*x^2+C*x+D, data = df[df$ID != i,], start = list(A=0.02, B=-0.6, C= 50, D=200)), silent=TRUE) 
    Out <- if (inherits(fit1, "nls")) NSE(sim = predict(fit1, newdatadata=df[df$ID==i,]), obs = df$y, na.rm=T) 
    } 

不過,我有這樣的錯誤消息:

Error in valindex.default(sim, obs) : 
    Invalid argument: 'length(sim) != length(obs)' !! (96!=97) !! 

有人能幫助我嗎?

+0

@Tensibai。我更新了我的問題。 – SimonB

+0

@LyzandeR。那麼我也試過,但我仍然得到相同的錯誤信息。預測功能似乎預測了我的列車數據,而不是測試數據。這有點奇怪。 – SimonB

+0

@SimonB我提供了一個答案,顯示了問題所在。 – LyzandeR

回答

1

你有一些小的失誤和一個大的邏輯錯在上面的代碼,我下面的地址:

的所有代碼首先應該是這樣的:

library(stats) 
library (hydroGOF) 

id <- unique(df$ID) 
for (i in id){ 
    fit1 <- try(nls(y~A*x^3+B*x^2+C*x+D, data = df[df$ID != i,], start = list(A=0.02, B=-0.6, C= 50, D=200)), silent=TRUE) 
    Out <- if (inherits(fit1, "nls")) NSE(sim = predict(fit1, newdata=df[df$ID==i,]), obs = df$y[df$ID==i], na.rm=T) 
} 

在你的問題中, NSE函數您設置參數爲newdatadata=df[df$ID==i,])而不是newdata=df[df$ID==i,])即有一個額外的data在那裏導致運行函數(您拼寫錯誤的參數:))時,麻煩。此外,obs參數的長度不正確,因爲將使用整個y列,但您只需要df$y[df$ID==i],它的長度爲1(以便與現在長度爲1的預測相匹配)。

現在糾正後上面的代碼將運行。

但是,一旦你運行它,你會發現它會產生一個警告,說你不能在'sum((obs - mean(obs))^2)=0' => it is not possible to compute 'NSE'時使用NSE。在你的情況,因爲你只有一個obs計算'sum((obs - mean(obs))^2)=0'將始終爲零。

所以,你不能使用這項技術與NSE,因爲它會失敗的定義(因爲你試圖計算一個觀察NSE)。您可能應該收集所有的一次性預測,將它們存儲在一個變量中,然後對df$y使用該變量的NSE。那可行。

我的意思是以下(含留一出CV完成):

Out <- c() 
id <- unique(df$ID) 
for (i in id){ 
    fit1 <- try(nls(y~A*x^3+B*x^2+C*x+D, data = df[df$ID != i,], start = list(A=0.02, B=-0.6, C= 50, D=200)), silent=TRUE) 
    Out[i] <- if (inherits(fit1, "nls")) sim = predict(fit1, newdata=df[df$ID==i,]) 
} 

這將現在的工作:

> NSE(Out, df$y) 
[1] 0.3440862 
+0

不錯。謝謝。那麼試着在同一個循環中計算兩個函數,並且有一個Out2對象。假設我有這個伽馬函數以及'fit1 < - try(nls(y〜A *(x^B)*(exp(k * x)),data = dft [df $ ID!= i,] ,start = list(A = 1000,B = 0.170,k = -0.00295)),silent = TRUE)。我怎樣才能實現它? – SimonB

+0

@SimonB將其保存到'fit2',然後使用'out2'變量,其方式與'out'完全相同。我想不出更好的。 – LyzandeR

+0

好的。這應該確實有效。我也想將這個循環應用於數據框的列表中,而不是僅在一個即'df'上。我想我必須做出一個功能,對吧?任何想法我可以做到嗎? – SimonB