2017-04-15 4 views
1

Hier einige Beispieldaten:Nehmen vorhersagen() zwischen data.frames innerhalb von zwei Listen

df_1 = read.table(text = 'Year count var1 
         1951  12 380 
         1952  13 388 
         1953  11 400 
         1954  14 411 
         1955  14 422 
         1956  14 437 
         1957  12 451 
         1958  14 465 
         1959  13 481 
         1960  15 502 
         1961  17 522 
         1962  16 549 
         1963  14 572 
         1964  16 580', header = TRUE) 

df_2 = read.table(text = 'Year count var1 
         1951  12 380 
         1952  13 388 
         1953  11 400 
         1954  15 411 
         1955  14 422 
         1956  15 437 
         1957  11 451 
         1958  14 465 
         1959  13 481 
         1960  15 502 
         1961  20 522 
         1962  17 549 
         1963  14 572 
         1964  16 592', header = TRUE) 

lst1 = list(df_1, df_2) 


#split data.frames within lst1 and create training and testing lists 
lst_train = lapply(lst1, function(x) subset(x, Year < 1959)) 
lst_test = lapply(lst1, function(x) subset(x, Year > 1958)) 

ich die Support-Vektor-Maschine Modell beantrage (SVM):

library(e1071) 

#run SVM model for all data.frames within lst_train 
svm_fit_lst = lapply(lst_train, function(x) svm(count ~ var1, data = x)) 

Jetzt wünsche ich mich bewerben die prediction() Funktion zwischen svm_fit_lst und lst_test data.frames aber R gibt mir einen Fehler, wenn ich den folgenden Code ausführen:

svm_pred_lst = lapply(lst_test, function(x) {predict(svm_fit_lst, newdata = x)}) 

Fehler in UseMethod („vorhersagen“): keine anwendbare Methode für ‚vorhersagen‘ auf ein Objekt der Klasse „Liste“ angewandt

Ich wünsche nur die predict() Funktion zwischen svm_fit_lst[1] und lst_test[1] angewandt werden, und svm_fit_lst[2] und lst_test[2].

Irgendwelche Vorschläge? Dank

+0

Sie haben tatsächlich zwei Modelle innerhalb 'svm_fit_lst', das ist eine' liste' und deshalb erhalten Sie den Fehler. Das wird also funktionieren: '{predict (svm_fit_lst [[1]], newdata = x)}' – mtoto

+0

ja, ich habe zwei Modelle innerhalb von svm_fit_lst und ich möchte svm_fit_lst [1] zusammen mit lst_test [1] und svm_fit_lst [ 2] mit lst_test [2] durch die Funktion predict(). – aaaaa

+1

sollten Sie in diesem Fall wahrscheinlich eine for-Schleife verwenden. – mtoto

Antwort

2

Weil Sie durch zwei Listen müssen laufen, betrachtet Map (Wrapper mapply) statt lapply:

svm_pred_lst = Map(function(s, l) predict(s, newdata=l), svm_fit_lst, lst_test) 

Gleichwertig:

svm_pred_lst = mapply(function(s, l) predict(s, newdata=l), svm_fit_lst, lst_test, SIMPLIFY = FALSE) 
1

Weil wir mit einem sequenziellen Problem hier zu tun hat, ist es am besten, ein for-Schleife zu schreiben, die Aufgabe zu erfüllen:

result <- list() 
for (i in 1:length(svm_fit_lst)){ 
     result[[i]] <- predict(svm_fit_lst[[i]], 
           newdata = lst_test[[i]]) 
} 

#Test 
result 
#[[1]] 
#  9  10  11  12  13  14 
#13.94310 13.69655 13.55169 13.52698 13.52656 13.52656 
# 
#[[2]] 
#  9  10  11  12  13  14 
#13.84789 13.67391 13.55716 13.53580 13.53542 13.53542 
+0

ok danke. aber Sie haben einen Fehler in der Schleife: Länge (svm_fit_lst) ist die richtige – aaaaa

Verwandte Themen