J'ai une fonction comme suit:une régression inverse Construct par sapply et uniroot
V <- seq(50, 350, by = 1)
> VK
Voltage^0 Voltage^1 Voltage^2 Voltage^3
-1.014021e+01 9.319875e-02 -2.738749e-04 2.923875e-07
> plot(x = V, exp(exp(sapply(0:3, function(x) V^x) %*% VK)), type = "l"); grid()
Maintenant, je voudrais faire une régression inverse sur cette certaine fonction. Je l'ai vu Solving for the inverse of a function in R:
inverse = function (f, lower = -100, upper = 100) { function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper) 1 }
square_inverse = inverse(function (x) x^2, 0.1, 100)
square_inverse(4)
et je suis en train de l'adapter à mes besoins comme suit:
certain_function <- function(x=V) { exp(exp(sapply(0:3, function(x) V^x) %*% VK)) }
inverse = function (f, lower = 50, upper = 350) {
function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]
}
inverse_regression = inverse(certain_function, 50, 350)
inverse_regression(2)
Malheureusement, ce rendement:
Error in uniroot((function(x) f(x) - y), lower = lower, upper = upper) :
f() values at end points not of opposite sign In addition: Warning messages:
1: In if (is.na(f.lower)) stop("f.lower = f(lower) is NA") :
the condition has length > 1 and only the first element will be used
2: In if (is.na(f.upper)) stop("f.upper = f(upper) is NA") :
the condition has length > 1 and only the first element will be used
Pour autant que je compris : L'erreur signifie qu'il y a plus de racines qu'une seule (uniroot ne peut gérer qu'une racine) mais il ne devrait pas y avoir plus d'une racine car c'est une fonction strictement monotone. Les avertissements que je ne comprends pas ..
modifier: Je suis en train de se placer derrière elle .. je l'ai enlevé les deux exponentielles qui donne le tracé suivant:
et cela génère encore les éléments suivants erreur:
> inverse_regression(0.1)
Error in uniroot((function(x) f(x) - y), lower = lower, upper = upper) :
f() values at end points not of opposite sign In addition: Warning messages:
1: In if (is.na(f.lower)) stop("f.lower = f(lower) is NA") :
the condition has length > 1 and only the first element will be used
2: In if (is.na(f.upper)) stop("f.upper = f(upper) is NA") :
the condition has length > 1 and only the first element will be used
Pourquoi est-ce? Évidemment, la courbe a des signes opposés aux deux extrémités. Je suppose que les points extrêmes signifient les points gauche et droite à la racine?
Ok, je l'ai résolu. Je ne sais pas ce que c'était exactement mais quand j'ai transformé le produit de matrice-vecteur à une fonction régulière cela fonctionne :) – Ben