首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我是R的初学者,我正在试着解一个方程系统,但当我运行时,我在R中遇到错误

我是R的初学者,我正在试着解一个方程系统,但当我运行时,我在R中遇到错误
EN

Stack Overflow用户
提问于 2018-06-23 00:27:35
回答 1查看 72关注 0票数 0
代码语言:javascript
复制
# my error : Error in F[1] <- n/(X[0]) - sum(log(1 + Y^exp(X[1] + X[2] * x))) : replacement has length zero

set.seed(16)

#Inverse Transformation on CDF

n=100

SimRRR.f <- function(100, lambda=1,tau)) {
  x= rnorm(100,0,1)
  tau= exp(-1-x)
  u=runif(100)
  y= (1/(u^(1/lambda)-1))^(1/tau)
  y
}
Y<-((1/u)-1)^exp(-1-x)

# MLE for Simple Linear Regresion

# System of equations

library(rootSolve)
library(nleqslv)

model <- function(X){
  F <- numeric(length(X)) 
  F[1] <- n/(X[0])-sum(log(1+Y^exp(X[1]+X[2]*x)))
  F[2] <- 2*n -(X[0]+1)*sum(exp(X[1]+X[2]*x))*Y^( exp(X[1]+X[2]*x))*log(Y)/(1+ Y^( exp(X[1]+X[2]*x)))

  F[3] <- sum(x) + sum(x*log(Y))*exp(X[1]+X[2]*x) -(X[0]+1)*X[1]*sum(exp(X[1]+X[2]*x)*Y^(exp(X[1]+X[2]*x)*log(Y)))/(1+ Y^( exp(X[1]+X[2]*x)))

# Solution

  F

}

startx <- c(0.5,3,1) # start the answer search here
answers<-as.data.frame(nleqslv(startx,model))
EN

回答 1

Stack Overflow用户

发布于 2018-06-23 00:55:15

问题在于,您在SimRRR函数内部定义了xutauy,但在函数外部却试图根据它们来定义Y

使用一个函数,你给它输入,然后你就会得到输出。在函数执行其工作的过程中定义的所有其他变量在结束时都会消失。现在,Y应该是一系列NAs (除非您在处理函数时在全局环境中定义了上述变量...)

尝试以下函数,看看它们是否能完成工作:

代码语言:javascript
复制
# I usually put all my library calls together at the beginning of the script.
library(rootSolve)
library(nleqslv)

x = rnorm(n,0,1) # see below for why this is pulled out.
SimRRR.f <- function(x, lambda=1,tau)) { # 100 can't be by itself in the function call.  everything in there needs to be attached to a variable.
  n <- length(x)
  tau= exp(-1-x)
  u=runif(n)
  y= (1/(u^(1/lambda)-1))^(1/tau)
  y
}
Y_sim = SimRRR.f(n = 100, lambda = 1, tau = 1) # pick the right tau, it's never defined here.

你的第二个函数有更多的问题。也就是说,它依赖于x,它在任何地方都没有定义。您要么需要上一个函数中的x,要么您实际上指的是X。我假设您确实需要x的值,因为X的长度只有3。这就是为什么我在最后一次函数调用中取出它的原因--我们现在就需要它。

更新

评论中还指出,这里的索引是错误的。我之前没有捕捉到这一点( F元素的定义是正确的)。我想我现在也解决了索引问题:

代码语言:javascript
复制
model <- function(X, Y, x){  # If you use x and Y in the function, define them here.
  n <- length(x)

  F <- numeric(length(X)) 
  F[1] <- n/(X[1])-sum(log(1+Y^exp(X[2]+X[3]*x)))
  F[2] <- 2*n -(X[1]+1)*sum(exp(X[2]+X[3]*x))*Y^( exp(X[2]+X[3]*x))*log(Y)/(1+ Y^( exp(X[2]+X[3]*x)))

  F[3] <- sum(x) + sum(x*log(Y))*exp(X[2]+X[3]*x) -(X[1]+1)*X[2]*sum(exp(X[2]+X[3]*x)*Y^(exp(X[2]+X[3]*x)*log(Y)))/(1+ Y^( exp(X[2]+X[3]*x)))  

# Solution

  F

}

我不熟悉nleqslv包,但除非定义了将其转换为数据帧的方法,否则它可能不会运行得很好。在转换之前,我会确保其他一切都正常工作。

代码语言:javascript
复制
startx <- c(0.5,3,1) # start the answer search here
answers <- nleqslv(startx,model, Y = Y_sim, x = x)
answer_df <- as.data.frame(answers)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50992123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档