R: Проблемы при построении выборочных значений из кривой - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь смоделировать сигнал, чтобы применить некоторые методы нелинейной подгонки, но у меня есть некоторые проблемы при его построении.

x<-sample(seq(0,1,length.out = 1000),200)
y<-2*sin(4*pi*x)-6*abs(x-0.4)^(0.3)+2*exp(-30*(4*x-2)^2)+8*x+rnorm(200,0,0.5)
s<-2*sin(4*pi*x)-6*abs(x-0.4)^(0.3)+2*exp(-30*(4*x-2)^2)+8*x
plot(x,y)
lines(x,s,col="red")

Идея состоит в том, что я хочу иметь 200 наблюдений, равномерно дискретизированных с помощью аддитивного члена белого шума, и я хотел бы построить этот «возмущенный» сигнал вместе с исходным сигналом.(y и s соответственно).Дело в том, что если я использую код, который я написал, я получаю в результате что-то вроде:

enter image description here

Возможно, это такая простая вещь, но я 'Я как бы застрял с этим.

Любая подсказка или предложение будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вам нужно изменить порядок x наблюдений в порядке возрастания, вы можете сделать это, сохранив все в объекте dataframe, а затем упорядочив его:

x<-sample(seq(0,1,length.out = 1000),200)
df_p= data.frame(x)
df_p$y<-2*sin(4*pi*df_p$x)-6*abs(df_p$x-0.4)^(0.3)+2*exp(-30*(4*df_p$x-2)^2)+8*df_p$x+rnorm(200,0,0.5)
df_p$s<-2*sin(4*pi*df_p$x)-6*abs(df_p$x-0.4)^(0.3)+2*exp(-30*(4*df_p$x-2)^2)+8*df_p$x

df_p = df_p[order(df_p$x),]

plot(df_p$x,df_p$y)
lines(df_p$x, df_p$s,col="red")

Также, если вы хотите избежать этого шага, вы можетеиспользуйте библиотеку ggplot2:

p <- ggplot(df_p) + geom_point(aes(x = x,y= y)) + geom_line(aes(x=x,y=s,color='red'))
plot(p)
0 голосов
/ 04 декабря 2018

Линии строятся последовательно, и вы решили случайным образом нарисовать свои значения X, чтобы значения x, сидящие рядом друг с другом в x, не были рядом друг с другом на оси - отсюда и беспорядок.Просто сортируйте это:

x<-sort(sample(seq(0,1,length.out = 1000),200))
y<-2*sin(4*pi*x)-6*abs(x-0.4)^(0.3)+2*exp(-30*(4*x-2)^2)+8*x+rnorm(200,0,0.5)
s<-2*sin(4*pi*x)-6*abs(x-0.4)^(0.3)+2*exp(-30*(4*x-2)^2)+8*x
plot(x,y)
lines(x,s,col="red")

Другой способ сделать это на лету, упомянутый Микки, это:

ord = order(x)
lines(x[ord], s[ord], col = 'red')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...