楼主: chengm03
7887 9

真心请教:关于R中函数向量的运算 [推广有奖]

  • 0关注
  • 0粉丝

初中生

4%

还不是VIP/贵宾

-

威望
0
论坛币
2967 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
155 点
帖子
0
精华
0
在线时间
16 小时
注册时间
2009-8-17
最后登录
2018-5-22

楼主
chengm03 发表于 2010-2-27 11:20:09 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
被这个问题困扰很久,希望大牛们能帮忙看一下。
就下面一段代码来说:

subt、eta是已知数值向量,b、phi、xi如下定义都是多维的函数的向量
b <- function(x)  c(cos(4*pi*x),sin(8*pi*x))             #the true density

phi <- function(x) c(x-1/2,x^2-x+1/6)     

xi <- function(x){                              #reproducing kernel
k3 <- function(x){
k3 <- (x^3-3/2*x^2+1/2*x)/6
}
k6 <- function(x){
k6 <- (x^6-3*x^5+5/2*x^4-1/2*x^2+1/42)/720
}
xi <- k3(subt)*k3(x)+k6(abs(subt-x))           #subt: subset of all the sample
}

vec <- function(x)  c(b(x),phi(x),xi(x))       #vector containing b, phi and xi

g <- function(x){             #g(x): inner product of previous vector and eta
g <- drop(crossprod(eta,vec(x)))         注:eta和vec维数相同
}

mu <- function(ll,g,u){             #mu in the formula; ll: lower limit of integration
eg <- function(x)  exp(g(x))
ueg <- function(x)  u(x)*exp(g(x))
nume <- integrate(ueg,ll,1)$value   #numerator
deno <- integrate(eg,ll,1)$value     #denominator
mu <- nume/deno
}

然后出现下面的错误:

命令:mu(0,g,b)

错误于crossprod(x, y) : 非整合变元
此外: Warning messages:
1: 长对象之长度不是短对象之长度的整倍 in: k3(subt) * k3(x)
2: 长对象之长度不是短对象之长度的整倍 in: subt - x

简单的如下也会出错:

命令:mu(0,phi,b)

错误于integrate(ueg, ll, 1) : evaluation of function gave a result of wrong length

我觉得第二个问题可能出在积分不能对函数的向量进行,第一个就不太清楚。
希望大家能指点一下,另外不知道有没有关于函数的向量的包?谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:ETA 已知数 SUB 下定义 请教 函数 运算 向量 真心

沙发
epoh 发表于 2010-2-27 16:21:53
你没定义 function u
最好把subt、eta贴上,一次解决.

藤椅
aresblq 发表于 2010-2-27 21:46:04
同意楼上,ueg <- function(x)  u(x)*exp(g(x))中u(x)是什么呢?

板凳
chengm03 发表于 2010-2-28 01:01:03
2# epoh
谢谢您的建议,我把前面的定义部分也补充一下:
rm(list=ls())
e <- function(x){
e <- exp(sin(8*pi*x)+cos(pi*x))
}
ei <- integrate(e,0,1)$value               
                                      
f <- function(x){
f <- e(x)/ei
}   
                                      #density
N <- 1000;
r1 <- runif(N,0,1);
r2 <- runif(N,0,1);
M <- ceiling(optimize(f,c(0,1),maximum=TRUE)$objective);            
sample <- r1[f(r1)>M*r2]   
n <- 50                 #sample size
sample <- sample[1:n]                     #rejection sampling
c <- runif(n,0,1);
delta <- rep(1,n);
delta[c<=sample] <- 0;  #indicator variate
t <- pmin(sample,c);                      #independent censoring
subt <- t[1:5];                                #sunset of the sample

lambda <- 1;  beta <-rep(1,2); d <- rep(1,2); c <- rep(1,length(subt));  #initial value
eta <- c(beta,d,c)                                   #vector containing all the parameters

t是根据密度函数用舍选抽样随机模拟的一个数据集,subt是其一个子集,eta是参数估计的初始值,这里面为了方便调试都进行了一些简化。

报纸
chengm03 发表于 2010-2-28 01:02:21
谢谢,关于您说的u的定义,我觉得外面函数定义了u作为变量的话,里面的函数调用u是不是就算已知函数了。
3# aresblq

地板
epoh 发表于 2010-2-28 08:54:34
只要维数抓对,
xi(x) g(x),都可运行
只是依旧错误在f(x, ...) : 没有这个函数 "u"

7
aresblq 发表于 2010-3-1 09:20:08
经过本人的测试,U根本没有问题,关键的问题就是积分函数不支持函数向量的运算,所以要用循环改写代码就可以了,

8
aresblq 发表于 2010-3-1 09:28:08
R本身对函数向量的运算支持很好,这个本人也经过了测试,但是对于个别的运算函数,不支持函数向量也是正常的,因为:首先,函数成千上万,要让所有相关的函数都支持函数向量是一项十分复杂而巨大的工程;其次,采用函数向量极容易出错,而通过使用循环的简单处理就可以实现这一功能;再者,这可能是S语言的定义使然吧??

9
chengm03 发表于 2010-3-14 15:59:38
谢谢您的指点,我也准备用循环去解决这个问题了。
7# aresblq

10
mandaisy 发表于 2010-4-13 16:43:18
受教受教,谢谢!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 02:57