R 如何求解奇异梯度矩阵误差?

R 如何求解奇异梯度矩阵误差?,r,regression,non-linear-regression,R,Regression,Non Linear Regression,我正在创建一个非线性回归模型来拟合下面的数据 密谋 我不断发现错误: 初始参数估计的奇异梯度矩阵 谁能解释一下我的模型有什么问题吗?我试图写的方程是y=(p1*logbasep2(x))/(x^p3),其中p1、p2和p3是常数 p1 <- 1 p2 <- 1 p3 <- 2 model1 = nls(ydata ~ ((p1*log(xdata, p3))/(xdata)^p2), start = list(p1 = p1, p2 = p2, p3 = p3)) 事

我正在创建一个非线性回归模型来拟合下面的数据

密谋

我不断发现错误:

初始参数估计的奇异梯度矩阵

谁能解释一下我的模型有什么问题吗?我试图写的方程是
y=(p1*logbasep2(x))/(x^p3)
,其中
p1
p2
p3
是常数

p1 <- 1
p2 <- 1 
p3 <- 2


model1 = nls(ydata ~ ((p1*log(xdata, p3))/(xdata)^p2), start = list(p1 = p1, p2 = p2, p3 = p3))

事实证明,你的问题更像是数学问题而不是统计问题。问题是
log(x,b1)
log(x,b2)
的区别只是一个常数(
log(x,b1)
=
log(x,b2)*log(b2,b1)
)。这意味着您的
p1
p3
参数是冗余的。因此,如果您省略了p3,一切都会正常工作(这只是更改公式的许多合理方法中的一种选择…)

最好将
nls
data
参数一起使用,因为这样可以更容易地预测新值:

dd <- data.frame(x=xdata,y=ydata)
model1 = nls(y ~ ((p1*log(x))/(x)^p2),
             start = list(p1 = 1, p2 = 1),
             data=dd)

dd您需要更好的起始值。同样从你的方程来看,当扩展数据为1时,无论参数值如何,ydata都将为零,这可能会使事情变得困难。你能粉碎你的数据吗:如果能,你能用
dput(ydata)
dput(xdata)
ps什么是
logbasep2
用logbasep2编辑你的问题吗?我的意思是,我希望对数的基数也是一个参数。我们感谢你的努力,但请发布
dput()的结果
作为问题中的文本,而不是屏幕截图(这种格式对于试图复制您的问题的人来说或多或少是无用的…)您的
dput
输出不完整。。。(请不仅仅包括前三行…)感谢您的回复。。。因此,如果曲线明显缺少数据点,这是否意味着我为拟合点定义的函数本身是错误的,我需要找到一个新的多项式/对数函数来拟合这些点?“所有模型都是错误的…”(框)——但是的,这意味着你应该能够找到一个更好的模型。两个明显的问题是(1)您的模型在x=1时固定为零;(2) 当x变大时,你的模型变为零——这两个特征都与你的数据相矛盾……嘿,本——再次感谢你的回答。。我很难找到一个函数来优化我的数据。我不是在征求具体的建议,但是你会说最好的方法应该是对不同类型的函数(多项式/对数等)进行反复试验,直到我找到一个能够通过我的大部分观点并且准确的方法吗?这是一个大话题。理想情况下,您可以考虑数据的几何图形(哪些方面适合/不适合),并适当调整曲线,例如添加垂直偏移
y~p0+((p1*log(x))/(x)^p2)
。还值得考虑生成数据的过程。。。也许(?)有用。
dd <- data.frame(x=xdata,y=ydata)
model1 = nls(y ~ ((p1*log(x))/(x)^p2),
             start = list(p1 = 1, p2 = 1),
             data=dd)
xvec <- seq(1,7,length=101)
par(las=1,bty="l")  ## cosmetic
plot(y~x,data=dd)
lines(xvec,predict(model1,newdata=data.frame(x=xvec)))