- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 R 中使用 Newton-Raphson 算法来最小化我为一个非常具体的问题编写的对数似然函数。老实说,估计方法超出了我的能力范围,但我知道我的领域(心理测量学)中有很多人使用 NR 算法进行估计,所以我正在尝试使用这种方法,至少在开始时是这样。我有一系列嵌套函数,它们返回标量作为特定数据向量的对数似然估计:
log.likelihoodSL <- function(x,sxdat1,item) {
theta <- x[1]
rho <- x[2]
log.lik <- 0
for (it in 1:length(sxdat1)) {
val <- as.numeric(sxdat1[it])
apars <- item[it,1:3]
cpars <- item[it,4:6]
log.lik <- log.lik + as.numeric(log.pSL(theta,rho,apars,cpars,val))
}
return(log.lik)
}
log.pSL <- function(theta,rho,apars,cpars,val) {
p <- (rho * e.aSL(theta,apars,cpars,val)) + ((1-rho) * e.nrm(theta,apars,cpars,val))
log.p <- log(p)
return(log.p)
}
e.aSL <- function(theta,apars,cpars,val) {
if (val==1) {
aprob <- e.nrm(theta,apars,cpars,val)
} else if (val==2) {
aprob <- 1 - e.nrm(theta,apars,cpars,val)
} else
aprob <- 0
return(aprob)
}
e.nrm <- function(theta,apars,cpars,val) {
nprob <- exp(apars*theta + cpars)/sum(exp((apars*theta) + cpars))
nprob <- nprob[val]
return(nprob)
}
这些函数都按照显示的顺序依次调用彼此。最高层函数的调用如下:
max1 <- maxNR(log.likelihoodSL,grad=NULL,hess=NULL,start=x,print.level=1,sxdat1=sxdat1,item=item)
这是输入数据的示例(在本例中我将其称为sxdat1
):
> sxdat1
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
2 1 3 1 3 3 2 2 3 2 2 2 2 2 3 2 3 2
V19 V20
2 2
这是变量item
:
> item
V1 V2 V3 V4 V5 V6
[1,] 0.2494625 0.3785529 -0.6280155 -0.096817808 -0.7549263 0.8517441
[2,] 0.2023690 0.4582290 -0.6605980 -0.191895013 -0.8391203 1.0310153
[3,] 0.2044005 0.3019147 -0.5063152 -0.073135691 -0.6061725 0.6793082
[4,] 0.2233619 0.4371988 -0.6605607 -0.160377714 -0.8233197 0.9836974
[5,] 0.2257933 0.2851198 -0.5109131 -0.044494872 -0.5970246 0.6415195
[6,] 0.2047308 0.3438725 -0.5486033 -0.104356236 -0.6693569 0.7737131
[7,] 0.3402220 0.2724951 -0.6127172 0.050795183 -0.6639092 0.6131140
[8,] 0.2513672 0.3263046 -0.5776718 -0.056203015 -0.6779823 0.7341853
[9,] 0.2008285 0.3389165 -0.5397450 -0.103565987 -0.6589961 0.7625621
[10,] 0.2890680 0.2700661 -0.5591341 0.014251386 -0.6219001 0.6076488
[11,] 0.3127214 0.2572715 -0.5699929 0.041587479 -0.6204483 0.5788608
[12,] 0.2697048 0.2965255 -0.5662303 -0.020115553 -0.6470669 0.6671825
[13,] 0.2799978 0.3219374 -0.6019352 -0.031454750 -0.6929045 0.7243592
[14,] 0.2773233 0.2822723 -0.5595956 -0.003711768 -0.6314010 0.6351127
[15,] 0.2433519 0.2632824 -0.5066342 -0.014947878 -0.5774375 0.5923853
[16,] 0.2947281 0.3605812 -0.6553092 -0.049389825 -0.7619178 0.8113076
[17,] 0.2290081 0.3114185 -0.5404266 -0.061807853 -0.6388839 0.7006917
[18,] 0.3824588 0.2543871 -0.6368459 0.096053788 -0.6684247 0.5723709
[19,] 0.2405821 0.3903595 -0.6309416 -0.112333048 -0.7659758 0.8783089
[20,] 0.2424331 0.3028480 -0.5452811 -0.045311136 -0.6360968 0.6814080
我想要最小化函数 log.likelihood()
的两个参数是 theta 和 rho,我想将 theta 限制在 -3 和 3 之间,将 rho 限制在之间0 和 1,但我不知道如何使用当前的设置来做到这一点。有人可以帮我吗?我是否需要使用与 Newton-Raphson 方法不同的估计方法,或者有没有办法使用函数 maxNR
来实现此方法,该函数来自包 maxLik
,我目前正在使用?谢谢!
编辑:向量x
包含参数theta和rho的起始值,只是c(0,0)
,因为这是“平均值”或这些参数的“默认”假设(就其实质性解释而言)。
最佳答案
更方便的数据形式:
sxdat1 <- c(2,1,3,1,3,3,2,2,3,2,2,2,2,2,3,2,3,2,2,2)
item <- matrix(c(
0.2494625,0.3785529,-0.6280155,-0.096817808,-0.7549263,0.8517441,
0.2023690,0.4582290,-0.6605980,-0.191895013,-0.8391203,1.0310153,
0.2044005,0.3019147,-0.5063152,-0.073135691,-0.6061725,0.6793082,
0.2233619,0.4371988,-0.6605607,-0.160377714,-0.8233197,0.9836974,
0.2257933,0.2851198,-0.5109131,-0.044494872,-0.5970246,0.6415195,
0.2047308,0.3438725,-0.5486033,-0.104356236,-0.6693569,0.7737131,
0.3402220,0.2724951,-0.6127172,0.050795183,-0.6639092,0.6131140,
0.2513672,0.3263046,-0.5776718,-0.056203015,-0.6779823,0.7341853,
0.2008285,0.3389165,-0.5397450,-0.103565987,-0.6589961,0.7625621,
0.2890680,0.2700661,-0.5591341,0.014251386,-0.6219001,0.6076488,
0.3127214,0.2572715,-0.5699929,0.041587479,-0.6204483,0.5788608,
0.2697048,0.2965255,-0.5662303,-0.020115553,-0.6470669,0.6671825,
0.2799978,0.3219374,-0.6019352,-0.031454750,-0.6929045,0.7243592,
0.2773233,0.2822723,-0.5595956,-0.003711768,-0.6314010,0.6351127,
0.2433519,0.2632824,-0.5066342,-0.014947878,-0.5774375,0.5923853,
0.2947281,0.3605812,-0.6553092,-0.049389825,-0.7619178,0.8113076,
0.2290081,0.3114185,-0.5404266,-0.061807853,-0.6388839,0.7006917,
0.3824588,0.2543871,-0.6368459,0.096053788,-0.6684247,0.5723709,
0.2405821,0.3903595,-0.6309416,-0.112333048,-0.7659758,0.8783089,
0.2424331,0.3028480,-0.5452811,-0.045311136,-0.6360968,0.6814080),
byrow=TRUE,ncol=6)
使用maxNR
:
library(maxLik)
x <- c(0,0)
max1 <- maxNR(log.likelihoodSL,grad=NULL,hess=NULL,start=x,
print.level=1,sxdat1=sxdat1,item=item)
注意 rho
时发生的警告消极徘徊。然而,maxNR
可以恢复由此得出一个估计值 (theta=-1, rho=0.63),该值位于 的内部可行集。 L-BFGS-B
无法处理非有限的临时结果,但边界让算法远离那些有问题的区域。
我选择使用 bbmle
来执行此操作而不是 optim
:bbmle
是 optim
的包装(以及其他优化工具),它提供了一些特定于似然估计的好功能(分析、置信区间、模型之间的似然比测试等)。
library(bbmle)
## mle2() wants a NEGATIVE log-likelihood
NLL <- function(x,sxdat1,item) {
-log.likelihoodSL(x,sxdat1,item)
}
编辑:在早期版本中我使用 control=list(fnscale=-1)
告诉优化器我正在传递一个应该最大化而不是最小化的对数似然函数;这得到了正确的答案,但随后尝试使用结果可能会变得非常困惑,因为该包没有考虑这种可能性(例如,报告的对数似然的符号是错误的)。这可以在包中修复,但我不确定它是否值得。
## needed when objective function takes a vector of args rather than
## separate named arguments:
parnames(NLL) <- c("theta","rho")
(m1 <- mle2(NLL,start=c(theta=0,rho=0.5),method="L-BFGS-B",
lower=c(theta=-3,rho=2e-3),upper=c(theta=3,rho=1-2e-3),
data=list(sxdat1=sxdat1,item=item)))
这里有几点:
rho=0.5
而不是在边界上rho
边界稍微在 [0,1] 之内(L-BFGS-B
在计算导数的有限差分近似时并不总是完全遵守边界)data
中的输入数据论点在这种情况下,我得到与 maxNR
相同的结果.
## Call:
## mle2(minuslogl = NLL, start = c(theta = 0, rho = 0.5),
## method = "L-BFGS-B", data = list(sxdat1 = sxdat1, item = item),
## lower = c(theta = -3, rho = 0.002), upper = c(theta = 3,
## rho = 1 - 0.002), control = list(fnscale = -1))
##
## Coefficients:
## theta rho
## -1.0038531 0.6352782
##
## Log-likelihood: -18.11
除非您确实迫切需要使用牛顿拉夫森而不是基于梯度的“拟牛顿”方法来完成此操作,否则我猜这已经足够好了。 (听起来你没有强有力的技术理由这样做,除了“这就是我所在领域的其他人所做的”——一个很好的理由,所有其他条件都相同,但在这种情况下还不足以让我挖掘当类似的方法很容易获得并且工作正常时,就可以实现 N-R。)
关于r - 约束 Newton-Raphson 估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14084336/
我是这个主题的新手,找不到原因:程序有时有效,有时无效(问完问题后,它根本不想接受我的答案,而我可以我想写多少就写多少,它没有反应,只是列出数字,我给了小费) #include float ab
我警告你,这可能会造成混淆,而且我编写的代码与其说是完成的代码,不如说是思维导图。 我正在尝试实现 Newton-Raphson 方法来求解方程。我想不通的是如何写这个 Python 中的方程,用于根
在下面的代码中,当我选择例如“max_n_iterations”等于 1 时,列表“approximations”在打印时显示两个元素,而它应该只显示一个元素(初始 x)。 这是什么原因? #This
我正在尝试使用 Newton Raphson 方法找到 N 个根。这是我对相同的实现... double derive(int guess, int m, int n) { return gues
我有一个大问题。我需要用 C++ 函数或类求解 3 个变量的 3 个方程的非线性系统。我考虑过使用 Newton-Raphson 方法来执行解决方案。不幸的是,我没有找到可以为我做到这一点的源代码。会
问题的简要说明:我使用 Newton Raphson 算法在多项式中求根,但在某些情况下不起作用。为什么? 我从“c++ 中的数值食谱”中获取了一种 Newton Raphson 混合算法,该算法会在
我编写了牛顿拉夫森求根算法的简单实现,它采用初始猜测 init、一元函数 f 和公差 tol 作为参数,如下所示: bool newton_raphson(double& init,
我正在尝试在 R 中使用 Newton-Raphson 算法来最小化我为一个非常具体的问题编写的对数似然函数。老实说,估计方法超出了我的能力范围,但我知道我的领域(心理测量学)中有很多人使用 NR 算
public class Sqrt { public static void main(String[] args) { double EPS = 1
我在一个简单的程序中工作,该程序使用 Newton-Raphson 方法计算任何给定函数的根。在这个程序中,我必须打印找到的根和进行的迭代次数。程序本身很好,我可以找到任何给定函数的根,但我无法正确计
x=float(raw_input('Enter a number to show its square root')) precise = 0.01 g=x/2.0 while abs(g**2-x
我在 Newton-Raphson 迭代的脚本中收到 'float' object is not Iterable 错误。我将迭代应用于函数 f(x) = sin(x),并将 x0 = 3 应用于迭代
#include #include #include float f(float x); float df(float x); void main() { float x0, x1, m
我目前正在学习一门类(class),讲师使用以下代码在 Java 中实现平方根功能 - public class Sqrt { public static void main(String[]
我已经编写了以下代码来使用牛顿法计算平方根,但每次运行它都会溢出。我试过自己检查,但没有发现任何错误。你们能帮帮我吗? double root(double n,double init){ i
我正在编写一个程序,用一个方程在 Java 中应用 Newton-Raphson 方法: f(x) = 3x - e^x + sin(x) 和 g(x) = f'(x) = 3- e^x + cos
我是 matlab 的新手,我需要创建一个函数,以起始近似值 x = a 执行 Newton-Raphson 方法的 n 次迭代。此起始近似值不算作交互,另一个要求是需要 for 循环。我查看了发布的
Newton-Raphson 平方法的时间复杂度是多少? Wikipedia: Newton's method 最佳答案 来自 http://en.citizendium.org/wiki/Newto
对于这个问题,我们需要利用 Newton-Raphson 方法来定位特定函数的根。 该代码适用于输入为单个值的情况,但当输入为向量时,答案不太正确。 例如,当 x=2是一个输入,值 2.5933返回时
我目前正在遍历一组非常大的数据~85GB(~600M 行)并简单地使用 newton-raphson 来计算一个新参数。截至目前,我的代码非常慢,关于如何加快速度的任何提示? BSCallClass
我是一名优秀的程序员,十分优秀!